
python 函数的递归
发布日期:2021-05-07 23:05:33
浏览次数:14
分类:精选文章
本文共 2726 字,大约阅读时间需要 9 分钟。
函数的递归(recursion)是编程语言里的重要组成部分,那么什么是函数的递归呢?函数的递归就是函数自己调用自己,直到找到一个返回值,再按照一定的规则返回函数的结果。递归的实现,是函数对本身的调用,每次调用时都会栈中进行操作,当没有返回时,程序出现bug
在Python语言中,设置了递归的层数,一般是100层,当超过这个层数的时候,Python会抛出一个错误,结束递归
>>> def recursion(): return recursion()>>> recursion()Traceback (most recent call last): File "", line 1, in recursion() File " ", line 2, in recursion return recursion() File " ", line 2, in recursion return recursion() File " ", line 2, in recursion return recursion() [Previous line repeated 991 more times]RecursionError: maximum recursion depth exceeded
但是我们可以设置递归函数递归的层数,这时需要引入sys库
import syssys.setrecursionlimit(所要设置的层数)
递归虽好,但是会占用大量内存资源,递归还具有一定的危险性,自己对自己的调用容易造成死循环
递归函数的常见例子:
递归求阶乘
def fact(n): if n == 1: return 1 if n > 1: return n * fact(n-1)N = input("请输入所求阶乘数:\n")while True: try: print("%s的阶乘为:%d" % (N , fact(eval(N)))) N = input("请输入所求阶乘数:\n") except: print("请输入数字!") break请输入所求阶乘数:55的阶乘为:120请输入所求阶乘数:
递归求斐波那契数列
def FB(n): if n == 1: return 1 if n == 2: return 1 if n > 2: return FB(n-1) + FB(n-2)while True: try: N = input('请输入入计算斐波那契数列的项数:\n') if not isinstance(eval(N),int): continue elif int(N) < 1: print("请输入大于1的整数") continue else: for i in range(1,int(N)+1): print("%d--->%d" %(i, FB(i))) #N = input('请输入入计算斐波那契数列的项数:\n') input()再循环体内不用再次输入 except: break 请输入入计算斐波那契数列的项数:81--->12--->13--->24--->35--->56--->87--->138--->21
同样可以利用迭代实现斐波那契数列
x , y = 0 , 1while True: n = eval(input("请输入需要计算的斐波那契数列的项数:\n")) for i in range(1,n+1): x , y = y , x + y print("%d ---> %d" %(i , y ))、>>>请输入需要计算的斐波那契数列的项数:81 ---> 12 ---> 23 ---> 34 ---> 55 ---> 86 ---> 137 ---> 218 ---> 34请输入需要计算的斐波那契数列的项数:
汉诺塔问题:
汉诺塔问题是古代的一个问题,问题的大概是:给出三个木柱X,Y,Z,其中X堆叠着从低端到顶端由大到小的圆盘,要求把所有的圆盘借助Y移动到Z,要求每一次只能移动一个,并且小的圆盘永远在大的圆盘的上面
def hanoi(n,x,y,z): global count #对于count需要声明全局变量,否则在函数结束后被释放 if n == 1: print(x + "--->" + z) # n 为1 时直接移动 count += 1 else: hanoi(n-1,x,z,y) # n-1 个先由x 移动到 y print(x + "--->" + z) #剩余的一个 x 移动到 z count += 1 #打印都要次数加一 hanoi(n-1,y,x,z) # n-1 个由 y 移动到 zwhile True: count = 0 N = eval(input("请输入汉诺塔的层数:输入小于1的数结束循环\n")) if N < 1 : print("结束循环计算循环!") break else: hanoi(N,"X","Y","Z") print("移动次数为:%d" %count)
3X--->ZX--->YZ--->YX--->ZY--->XY--->ZX--->Z移动次数为:7请输入汉诺塔的层数:输入小于1的数结束循环4X--->YX--->ZY--->ZX--->YZ--->XZ--->YX--->YX--->ZY--->ZY--->XZ--->XY--->ZX--->YX--->ZY--->Z移动次数为:15
在移动时,往往借助另一个完成移动,因此就用到了递归,递归时,三个柱子作用发生互换
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月23日 22时48分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
1月份2月份GitHub上最热门的23个Java开源项目
2019-03-05
maven安装
2019-03-05
2020第十五届全国大学生智能汽车竞赛——4X4矩阵键盘+Flash调参系统
2019-03-05
合并两个有序数组
2019-03-05
Ubuntu 环境下使用中文输入法
2019-03-05
小白学习Vue(?)--model选项的使用(自定义组件文本框双向绑定)
2019-03-05
聊聊我的五一小假期
2019-03-05
面向对象之异常处理:多路捕获
2019-03-05
Python简易五子棋
2019-03-05
MySQL8.0.19 JDBC下载与使用
2019-03-05
Windows安装MongoDB 4.2.8
2019-03-05
Vue新建项目——页面初始化
2019-03-05
Cent OS 7.6 服务器软件安装(这篇博客主要是为了方便我配置云主机的)
2019-03-05
MySQL使用系列文章
2019-03-05
Node.js包使用系列(一)——修改NPM全局下载和缓存路径
2019-03-05
TDengine使用(一)——TDengine下载与安装
2019-03-05
Node.js包使用系列(三)——常用npm包列表
2019-03-05
ubuntu和windows之间无法复制粘贴
2019-03-05
编译Linux内核--制作文件系统--远程调试程序
2019-03-05
启动加载器BootLoader
2019-03-05