博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
斐波那契_尾递归
阅读量:5165 次
发布时间:2019-06-13

本文共 2301 字,大约阅读时间需要 7 分钟。

# (1)计算任意数n的阶乘# 5! 5*4*3*2*1# 8! 8*7*6*5*4*3*2*1'''递归函数通过两个条件出发回的过程:(1) 当前函数彻底执行完毕的时候,触发回的过程,回到上一层函数的调用处(2) 当前函数遇到return 返回值的时,触发回的过程,回到上一层函数的调用处'''# 普通方法n = 5total = 1for i in range(1,n+1):	total *= iprint(total)# 5*4*3*2*1def jiecheng(n):	if n<=1 :		return 1	return n * jiecheng(n-1)# jiecheng(1) => 1res = jiecheng(5)print(res)'''# 代码解析:去的过程:n = 5 return 5 * jiecheng(5-1) => 5 * jiecheng(4)n = 4 return 4 * jiecheng(4-1) => 4 * jiecheng(3)n = 3 return 3 * jiecheng(3-1) => 3 * jiechneg(2)n = 2 return 2 * jiecheng(2-1) => 2 * jiecheng(1)n = 1 return 1回的过程:n = 2 return 2 * jiecheng(2-1) => 2 * 1n = 3 return 3 * jiecheng(3-1) => 3 *  2 * 1n = 4 return 4 * jiecheng(4-1) => 4 * 3 *  2 * 1n = 5 return 5 * jiecheng(5-1) => 5 *  4 * 3 *  2 * 1res =  5 *  4 * 3 *  2 * 1 =120'''# (2)尾递归: 只返回递归函数本身且非表达式(没有运算(+-*/..))'''只开辟一个栈帧空间完成递归函数(因为最终的返回值就是第一层空间的返回值,所以只需要一层栈帧空间即可,不停的进行替换)cpython解释器不支持.可以换一个支持尾递归的解释器(比如在公司内部大型服务器架构的解释器 推荐使用)'''# 方法一def jiecheng2(n,endval=1):	if n<=1 :		return endval	return jiecheng2(n-1,n*endval)res = jiecheng2(5,1)print(res)'''# 去的过程n=5 endval = 1	return jiecheng(5-1,5*1) => jiecheng(4,5*1)n=4 endval = 5*1	return jiecheng(4-1,4 *5*1) => jiecheng(3,4*5*1)n=3 endval = 4*5*1	return jiecheng(3-1,3*  4*5*1) => jiecheng(2, 3*4*5*1)n=2 endval = 3*4*5*1	return jiecheng(2-1,2*  3*4*5*1) => jiecheng(1, 2*3*4*5*1)n=1 endval = 2*3*4*5*1	n<=1 这个条件满足了 直接返回endval# 回的过程n=2 endval = 3*4*5*1	return jiecheng(2-1,2*  3*4*5*1) => 2*3*4*5*1n=3 endval = 4*5*1	return jiecheng(3-1,3*  4*5*1) => 2*3*4*5*1n=4 endval = 5*1	return jiecheng(4-1,4 *5*1) => 2*3*4*5*1n=5 endval = 1	return jiecheng(5-1,5*1) => 2*3*4*5*1	如果运行到最后一层函数,有返回值了,那么这个返回值就是最终的值,所有尾递归只需要一层栈帧空间.'''# 方法二 优化版# 系统底层用def jiecheng2(n,endval):	if n<=1 :		return endval	return jiecheng2(n-1,n*endval)# 给用户用 不需要用户填写第二个参数(比较人性化)def jiecheng3(n):	return jiecheng2(n,1)res = jiecheng3(5)print(res)# (3)斐波那契数列 # 1,1,2,3,5,8,13,21,34,55# 第n个数 它的数值是多少?# 除了前2个 ,后面每一个值都是上一个数 + 上上的数 两者之和def fib(n):	if n ==1 or n==2:		return 1			return fib(n-1) + fib(n-2)res = fib(5)print(res)'''代码解析:n = 5=> return fib(5-1) + fib(5-2)=> return fib(4) + fib(3) => 3 + 2 => 5fib(4) => 3fib(3)            +           fib(2)fib(2)+fib(1)=1+1=2       + 12+1 = 3fib(3) =>2fib(2) + fib(1)1 + 1 = 2'''

  

转载于:https://www.cnblogs.com/huangjiangyong/p/10906561.html

你可能感兴趣的文章
跨域问题整理
查看>>
[Linux]文件浏览
查看>>
64位主机64位oracle下装32位客户端ODAC(NFPACS版)
查看>>
获取国内随机IP的函数
查看>>
今天第一次写博客
查看>>
江城子·己亥年戊辰月丁丑日话凄凉
查看>>
IP V4 和 IP V6 初识
查看>>
Spring Mvc模式下Jquery Ajax 与后台交互操作
查看>>
(转)matlab练习程序(HOG方向梯度直方图)
查看>>
『Raid 平面最近点对』
查看>>
【ADO.NET基础-数据加密】第一篇(加密解密篇)
查看>>
C语言基础小结(一)
查看>>
STL中的优先级队列priority_queue
查看>>
UE4 使用UGM制作血条
查看>>
浏览器对属性兼容性支持力度查询网址
查看>>
OO学习总结与体会
查看>>
虚拟机长时间不关造成的问题
查看>>
面试整理:Python基础
查看>>
Python核心编程——多线程threading和队列
查看>>
Program exited with code **** 相关解释
查看>>