递归 雨点打透心脏的1/2处 2022-02-19 05:39 327阅读 0赞 # 递归Recursion # * 递归要求 1. 递归一定要有退出条件,递归调用一定要执行到这个退出条件。没有退出条件的递归调用,就是无限调用 2. 递归调用的深度不宜过深 * python对递归调用的深度做了限制,以保护解释器 * 超过递归深度显示,抛出RecursionError:maxinum recursion depth exceeded超出最大深度 * sys.getrecursionLimit() 可以查看当前解析器栈的最大深度 * 简单递归示例: 1. 求n的阶乘 #第一种实现 def factorial(n): return n if n==1 else n*factorial(n-1) #第二种实现 def factorial2(n,face=1): if n==1: return face else: return factorial2(n-1,n*face) print(factorial(5),factorial2(5)) 1. 将一个数逆序放入列表中,例如1234 ==》 \[4,3,2,1\] #思路一,取模递归调用 def numtolist(num,arr = []): if num<10: arr.append(num) else: arr.append(num%10) numtolist(num//10) return arr #思路二 利用列表的加法,保存返回值 def numtolist2(num): if num<10: return [num] else: return [num%10] + numtolist2(num//10) #思路三: 使用str类型递归实现 def numtolist3(num,arr = []): if isinstance(num,int): num = str(num) if len(num)==1: arr.append(int(num)) return else: arr.append(int(num[-1])) numtolist3(num[:-1]) return arr #思路四,参数限定为一个 def numtolist4(num): if isinstance(num,int): num = str(num) if len(num)==1: return [int(num)] else: return [int(num[-1])] + numtolist4(num[:-1]) #思路五,使用闭包 def numtolist5(num): arr = [] def numto(num): if num<10: arr.append(num) else: arr.append(num%10) numto(num//10) numto(num) return arr #思路六 使用devmod def numtolist6(num): if num<10: return [num] else: tmp = divmod(num,10) return [tmp[1]] + numtolist6(tmp[0]) print(numtolist(123),numtolist2(123),numtolist3(123),numtolist4(123),numtolist5(123),numtolist6(123),sep="\n") 1. 解决猴子吃桃问题 * 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想吃时,只剩下一个桃子了。求第一天共摘多少个桃子 #思路一 def ectpeach(day,num): print("第{}天有{}个桃子".format(day,num)) return num if day==1 else ectpeach(day-1,(num+1)*2) #思路二 def ectpeach2(day): return 1 if day==1 else (ectpeach2(day-1)+1)*2 print(ectpeach(10,1),ectpeach2(10)) * 递归总结 * 递归是一种很自然的表达,复合逻辑思维 * 递归相对运行效率低,每一次调用函数都要开辟栈帧 * 递归有深度限制,如果递归层次太深,函数反复压栈,栈内存很快就会溢出 * 如果是有线次数的递归,可以使用递归调用,或者使用循环代替,循环代码稍微复杂些,但是只要不是死循环,可以多次迭代直至算出结果 * 即使递归代码很简洁,但是能不用则不用递归
相关 递归---从台阶问题学习递归、递归优化和非递归 > 递归就是将大问题划分为若干个子问题,各个问题是嵌套关系,最小的那个问题的结果是已知的,大问题不断分解直到达到最小问题的过程叫做“递”,小问题的解释已知的,然后根据这个解回过 电玩女神/ 2023年06月17日 06:57/ 0 赞/ 36 阅读
相关 递归 include<iostream> include<cmath> using namespace std; const int Len = 66 - 日理万妓/ 2022年06月12日 01:41/ 0 赞/ 83 阅读
相关 递归 递归算法基本思想:找出递归子结构性质(原问题的解包含了子问题的解)、用子问题的解来递归定义原问题的解、找出递归终止条件。 示例: 例1 阶乘函数 阶乘函数可 ╰半橙微兮°/ 2022年06月09日 09:14/ 0 赞/ 314 阅读
相关 递归——线性递归与二分递归 递归 线性递归 例子1:数组求和 int sum( int A[], int n) { //数组求和算法:线性递归版 if 向右看齐/ 2022年05月21日 04:41/ 0 赞/ 357 阅读
相关 递归 递归优点:代码简单 代码量少 递归缺点:不易理解 用递归解决问题时,主要思路: 1.将一个大问题分解成子问题 2.子问题除了问题规模会变小,和原问题解决的思路是一 向右看齐/ 2022年05月03日 10:28/ 0 赞/ 238 阅读
相关 递归 1. public class HelloWorld \{ 2. public static void main(String\[\] args)\{ 3. // Sca 女爷i/ 2022年04月12日 10:50/ 0 赞/ 360 阅读
相关 递归 递归Recursion 递归要求 1. 递归一定要有退出条件,递归调用一定要执行到这个退出条件。没有退出条件的递归调用,就是无限调用 2 雨点打透心脏的1/2处/ 2022年02月19日 05:39/ 0 赞/ 328 阅读
相关 递归 问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:13 冷不防/ 2021年12月24日 08:43/ 0 赞/ 334 阅读
相关 递归 递归 递归就是一个函数直接或间接的调用自己.一般来说,递归需要有边界条件,递归前进段和递归返回段.当边界条件不满足的时,递归前进,当边界条件满足的时候,递归返回. 递归就 ﹏ヽ暗。殇╰゛Y/ 2021年12月12日 06:53/ 0 赞/ 263 阅读
相关 递归 递归只是让你解决方案更加清晰,并没有性能上的优势。实际上,在有些情况下,使用循环的性能更好。正如,在Stack Overflow 上,Leigh Caldwell 说了一句话: 男娘i/ 2021年09月13日 23:58/ 0 赞/ 392 阅读
还没有评论,来说两句吧...