递归调用

Java API —— 递归

笑着哭i 提交于 2020-01-28 05:02:18
1、方法定义中调用方法本身的现象 2、递归注意实现 1) 要有出口,否则就是死递归 2) 次数不能太多,否则就内存溢出 3) 构造方法不能递归使用 3、递归解决问题的思想和图解: 例子1:求5的阶乘 package diguidemos; /** * Created by gao on 15-12-27. */ /* * 需求:请用代码实现求5的阶乘。 * * 有几种方案实现呢? * A:循环实现 * B:递归实现 * a:做递归要写一个方法 * b:出口条件 * c:规律 */ public class DiGuiDemo01 { public static void main(String[] args) { int jc = 1; for (int i = 2; i <= 5; i++) { jc *= i; } System.out.println("5的阶乘是:" + jc); //5的阶乘是:120 System.out.println("5的阶乘是:"+jieCheng(5)); } /* * 做递归要写一个方法: * 返回值类型:int * 参数列表:int n * 出口条件: * if(n == 1) {return 1;} * 规律: * if(n != 1) {return n*方法名(n-1);} */ public static int jieCheng

递归文件遍历

本秂侑毒 提交于 2020-01-28 03:38:29
递归的最大深度是1000层,从1开始到998层就会被停止报错 递归函数, 自己调用自己 count = 1 def func(): global count print("我想找个女朋友", count) count = count + 1 func() func() 上面的是递归的一个小例子,话不说多上代码 遍历文件夹, 打印出所有的文件和普通文件的文件名 import os def func(filepath, n): # d:/sylar/ # 1,打开这个文件夹 files = os.listdir(filepath) # 2. 拿到每一个文件名 for file in files: # 文件名 # 3. 获取到路径 f_d = os.path.join(filepath, file) # d:/sylar/文件名/ # 4. 判断是否是文件夹 if os.path.isdir(f_d): # 5. 如果是文件夹. 继续再来一遍 print("\t"*n, file,":") # 打印文件名 func(f_d, n + 1) else: # 不是文件夹. 普通文件 print("\t"*n, file) func("d:/sylar",0) 来源: https://www.cnblogs.com/fangyanwangshijie/p/9505848.html

SICP学习笔记(1.2.1 ~ 1.2.2)

 ̄綄美尐妖づ 提交于 2020-01-27 20:12:42
SICP学习笔记(1.2.1 ~ 1.2.2) 周银辉 1, 递归过程 和 递归计算过程 在学习SICP前我还没注意过有这样的一个区分,因为我们始终停留在语法表面上的“递归过程(recursive procedure)”,而没有去理解其实质是否是“递归计算过程(recursive process)”。 递归过程:从语法书写层面上而言的,在过程的定义中,其直接或间接地引用该过程本身。 比如 F{F}或者 F{G{F}} 递归计算过程:从实际运算层面上而言的,一个在语法上按照递归过程书写的函数其在运算时可能是按照递归的方式也可能是按照迭代的方式进行的。这取决于解释器或编译器本身是否有对“递归”进行优化,比如Scheme解释器是“严格尾递归”的, 而C#之类的,即便在语法形式上是"尾递归"的,但其仍然不能被编译成迭代计算过程,当然,你可以使用for,while等. 要检测出一个递归过程在计算时到底是按照递归方式还是按照迭代方式进行的,非常容易,只要将其进行深度递归或无限次递归,如果Stack Overflow了,那么是按照递归方式计算的,仅仅是一个死循环似的不停计算但没有栈溢出,那么是按照迭代方式计算的。一般而言函数式编程语言(Scheme,Haskell等), 会按照迭代方式进行计算;命令式编程语言(C++,C#,Java等)会按照递归方式进行计算。 2,迭代计算过程 和 递归计算过程

数据结构——递归(回溯算法实现八皇后问题)

a 夏天 提交于 2020-01-27 17:32:34
递归——回溯算法 八皇后问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的经典案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8x8国际象棋棋盘上拜访8个皇后,使其不能够相互攻击,即:任意两个皇后都不能够处于同一行,同一列,同一斜线上,问共有多少种摆法? 解题思路: 1、第一个皇后先放在第一列上 2、第二个皇后在放在第二行的第一列上,然后判断是否符合条件,如果不符合,放在第二列,第三列。。。 如果符合,那么继续 3、继续第三个皇后,还是从第一列开始,然后第二列。。。当到最后第8个皇后也放在一个不冲突的位时,证明得到了一个正确的解 4、当有一个正确的解后,在栈退回到上一个栈时,回溯开始,最后就会将第一个皇后在第一列中所有解全部得到 5、然后在回头继续将第一个皇后放到第一行的第二列上,继续上面操作 注:我们通过一个一维数组就可以来解出八皇后的所有解,数组下标值可以认为是行,每个下标值对应的数据是在这一行中,皇后所在的列。因为数组下标为0,所以我们将行和列都从0开始 写三个方法: 1、用来放置皇后的方法 2、用来判断当前放置的皇后与已经放置的皇后是否冲突 3、打印方法 代码: package cn . littleworm ; /* 八皇后问题: 任意两个皇后不能够出现在同一行,同一列,同意斜线上 解题思路: 1、第一个皇后先放在第一列上 2

【算法】递归算法---作为树的基础知识点【待学习】

只愿长相守 提交于 2020-01-27 09:48:38
https://blog.csdn.net/feizaosyuacm/article/details/54919389 例题: https://blog.csdn.net/Leo1120178518/article/details/102703350 https://blog.csdn.net/qq_34039315/article/details/78679029 1.递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成 栈溢出 等。所以一般不提倡用递归算法设计程序。 2.要求: 递归算法所体现的“重复”一般有三个要求: 一是每次调用在规模上都有所缩小(通常是减半); 二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备( 通常前一次的输出就作为后一次的输入 ); 三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。 3.递归算法的实现(3点:1.入参和递归参数 2.算法 3

函数参数,返回值,递归函数

人走茶凉 提交于 2020-01-27 03:53:47
函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值 ,可以 相互组合 ,一共有 4 种 组合形式 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时, 是否接收参数,或者是否返回结果 ,是根据 实际的功能需求 来决定的! 如果函数 内部处理的数据不确定 ,就可以将外界的数据以参数传递到函数内部 如果希望一个函数 执行完成后,向外界汇报执行结果 ,就可以增加函数的返回值 1.1 无参数,无返回值 此类函数,不接收参数,也没有返回值,应用场景如下: 只是单纯地做一件事情 ,例如 显示菜单 在函数内部 针对全局变量进行操作 ,例如: 新建名片 ,最终结果 记录在全局变量 中 注意: 如果全局变量的数据类型是一个 可变类型 ,在函数内部可以使用 方法 修改全局变量的内容 —— 变量的引用不会改变 在函数内部, 使用赋值语句 才会 修改变量的引用 1.2 无参数,有返回值 此类函数,不接收参数,但是有返回值,应用场景如下: 采集数据,例如 温度计 ,返回结果就是当前的温度,而不需要传递任何的参数 1.3 有参数,无返回值 此类函数,接收参数,没有返回值,应用场景如下: 函数内部的代码保持不变,针对 不同的参数 处理 不同的数据 例如 名片管理系统 针对

leetcode-两两交换链表中的节点

六月ゝ 毕业季﹏ 提交于 2020-01-26 22:47:24
class Solution { public ListNode swapPairs(ListNode head) { return swap(head); } public ListNode swap(ListNode leftnode){ if(leftnode==null || leftnode.next == null){ return leftnode; } ListNode tempnextnode = leftnode.next; leftnode.next = swap(leftnode.next.next); tempnextnode.next = leftnode; return tempnextnode; } } 递归解决这类题的精髓就是让某一个Node的next是递归函数的返回值! 之前我的写法是在递归函数中拼装好了然后调用swap(node.next),这样会增加复杂度 来源: CSDN 作者: dogndaxiaodong 链接: https://blog.csdn.net/weixin_41327340/article/details/104089086

递归示例(一):遍历二叉树

心已入冬 提交于 2020-01-26 18:46:30
最近做项目经常用到递归,刚开始很久没用,不太熟悉,现在研究了下,并写下了学习笔记及开发经验总结。 递归热身 一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法需要调用自身。如果一个算法直接调用自己或间接地调用自己,就称这个算法是递归的(Recursive)。根据调用方式的不同,它分为直接递归(Direct Recursion)和间接递归(Indirect Recursion)。 比如,在收看电视节目时,如果演播室中也有一台电视机播放的是与当前相同的节目,观众就会发现屏幕里的电视套有一层层的电视画面。这种现象类似于直接递归。 如果把两面镜子面对面摆放,便可从任意一面镜子里看到两面镜子无数个影像,这类似于间接递归。 一个递归算法必须有两个部分:初始部分(Base Case)和递归部分(Recursion Case)。初始部分只处理可以直接解决而不需要再次递归调用的简单输入。递归部分包含对算法的一次或多次递归调用,每一次的调用参数都在某种程度上比原始调用参数更接近初始情况。 函数的递归调用可以理解为:通过一系列的自身调用,达到某一终止条件后,再按照调用路线逐步返回。递归是程序设计中强有力的工具,有很多数学函数是以递归来定义的。 如大家熟悉的阶乘函数,我们可以对n!作如下定义:f(n)= 1 (n=1) n*f(n-1) (n>=2) 一个算法具有的特性之一就是有穷性

java 递归

这一生的挚爱 提交于 2020-01-26 13:35:29
Java代码 public class TestRecursion{ //递归方法 public static void fun(int i){ if(i > 0){ i--; fun(i); System.out.print(i); } System.out.print(" ok "); } public static void main(String args[]){ fun(10); } } 这段代码看似简单,其中的奥秘你却未必尽知。 首先.什么是递归?相信大家都知道,就是方法直接或间接地调用自身。 要想深入理解递归,得从栈的角度去看待方法间的调用。 先来看一个简单的例子: Java代码 public void a(){} public void b(){ System.out.println("Hello"); a(); System.out.println("boy"); } 方法b()调用了方法a(),此时程序不再顺序执行,而是发生跳转。CPU首先将下一条机器指令的地址以及相关的参数信息压入栈中,然后程序跳转到a()的方法体中。当a()方法返回时,CPU会执行出栈操作,取出上一次存储的机器指令的地址以及参数信息,即System.out.println("boy")(当然了,System.out.println()不是一条机器指令,而是被翻译成多条机器指令)

算法导论第7章习题

纵然是瞬间 提交于 2020-01-26 00:34:46
做题要猜出题目的意图。 7.1-1 略 7.1-2 r-1, add if q=r-1, then $q = \lfloor (p+r)/2 \rfloor$。这说明元素全都一样的时候,quicksort伤不起。worst-case了,要$\Theta(n^2)$了。快排弱点1. 7.1-3 pivot要比较所有的数组元素,自然是n 7.1-4 PARTITION中Line4的<= changed to >= 7.2-1 T(n)=T(n-1)+\Theta(n)=T(0)+n*\Theta(n)=\Theta(n^2) 7.2-2 同7.1-2 7.2-3 These exercises demonstrate the weakness of the original quicksort. It’s the worst case. T(n) = T(n-1)+\Theta(n)=\Theta(n^2)。快排弱点2. 7.2-4 银行喜欢时间排序,用户喜欢支票号排序。这道题又说明了在nearly sorted list中,插入排序beat了快排。快排弱点3.因为用户使用多张支票是连号的,所以在一个时间段内,顶多是这几张支票打乱了顺序。而不是一天24小时之内所有的支票全部乱序。所以这个序列是差不多有序的。如果n个用户每次使用k张支票,插入排序最多需要O(nk)时间,如果k=1