2025年Python从放弃到入门——递归函数recur

Python从放弃到入门——递归函数recur简介 在一个函数体内 可以调用其他函数 如果一个函数的函数体内调用了该函数本身 该函数就是递归函数 递归函数必须要有明确的递归结束条件 也称为递归出口 用递归解决的问题必须满足两个条件 1 可以通过递归调用来缩小问题的规模 且新问题和原问题有着相同的形式 2 递归可以在满足一定的条件后退出

大家好,我是讯享网,很高兴认识大家。

简介

在一个函数体内,可以调用其他函数。
如果一个函数的函数体内调用了该函数本身,该函数就是递归函数。
递归函数必须要有明确的递归结束条件,也称为递归出口。
用递归解决的问题必须满足两个条件:
1.可以通过递归调用来缩小问题的规模,且新问题和原问题有着相同的形式。
2.递归可以在满足一定的条件后退出。

计算阶乘就是一个典型的例子。

def fact(n): if n==1: return 1 return n*fact(n-1) print('fact(6)=',fact(6)) fact(6)= 720 

讯享网

在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

讯享网print('fact(1000)=',fact(1000)) RecursionError: maximum recursion depth exceeded in comparison 

递归与循环

先来看一个计算列表元素和的例子。

def mysum(L): if not L: return 0 else: return L[0]+mysum(L[1:]) L=[1,2,3,4,5] print(mysum(L)) 15 

理论上,所有的递归函数都可以写成循环的方式。


讯享网

讯享网sum=0 while L: sum+=L[0] L=L[1:] print(sum) 15 

然而,如果L=[1,[2,[3,4],5],6,[7,8]] ,显然简单的循环语句不起作用,可以用递归来应对这种一般性的嵌套。isinstance用来做数据类型判断。

L=[1,[2,[3,4],5],6,[7,8]] def sumtree(L): tot=0 for x in L: if not isinstance(x,list): tot+=x else: tot+=sumtree(x) return tot print(sumtree(L)) 36 

队列和栈

递归调用内部,Python通过在每一次递归调用时把信息压入调用栈(stack)顶来实现递归,因此它记住了在什么地方返回以及在什么地方稍后继续。

让我们不使用递归而实现递归风格的过程式编程来显式地追踪步骤。
先进先出队列

讯享网L=[1,[2,[3,4],5],6,[7,8]] def sumtree1(L): tot=0 items=list(L) while items: front=items.pop(0) if not isinstance(front,list): tot+=front else: items.extend(front) #将pop出的元素放到列表后面 return tot print(sumtree1(L)) 36 

后进先出栈

def sumtree2(L): tot=0 items=list(L) while items: front=items.pop(0) if not isinstance(front,list): tot+=front else: items[:0]=front #将pop出的元素放到列表前面 return tot print(sumtree2(L)) 36 
小讯
上一篇 2025-02-23 14:31
下一篇 2025-02-06 12:58

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/15103.html