一.递归

  (1)递归就是函数自己调用自己的过程;

  (2)使用递归时,需要注意递归的出口,明确递归的终止条件。

 #计算n的阶乘
def fun(n):
if n==1:
return 1
else:
return fun(n-1)*n
print (fun(10))
3628800

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

  解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

 def test1(n):
return test2(n,1)
def test2(n,product):
if(n==1):
return product
else:
return test2(n-1,product*n)
3628800

二.python下实现汉诺塔问题

  汉诺塔是印度一个古老传说的益智玩具。汉诺塔的移动也可以看做是递归函数。

  我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为: 
    如果a只有一个圆盘,可以直接移动到c; 
    如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。 
  请编写一个函数,给定输入 n, a, b, c,打印出移动的步骤: 
  move(n, a, b, c)

  

 def move(n,a,b,c):
if n==1:
print (a,'-->',c)
else:
move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)
move(3,'A','B','C')
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

最新文章

  1. [转]JavaScript程序编码规范
  2. CPU cache
  3. 严重: Exception starting filter struts2解决方法!
  4. WINDOWS 2008Server 配置nginx 反向代理服务器
  5. 推荐两款Xcode插件:KSImageNamed & ColorSense
  6. wxWidgets简单的多线程
  7. 如何学习ios开发
  8. progressBar 自定义
  9. APUE 读书笔记 -----孤儿进程与僵尸进程[总结] +数据结构+C
  10. 使用CAEmitterLayer产生粒子效果
  11. jquery $(function) 区别
  12. 5款帮助简化的HTML5 Audio开发的Javascript类库
  13. CSS3的基础知识点
  14. Inno Setup入门(十八)——Inno Setup类参考(4)
  15. (中级篇 NettyNIO编解码开发)第八章-Google Protobuf 编解码-1
  16. 从Nest到Nesk -- 模块化Node框架的实践
  17. Android-Java-接口Interface
  18. [MySQL Code]Innodb 锁分配和锁冲突判断
  19. Cmd Markdown 编辑阅读器
  20. grpc 使用总结

热门文章

  1. How far away ? HDU - 2586 【LCA】【RMQ】【java】
  2. XSS闯关游戏准备阶段及XSS构造方法
  3. 学习总结javascript和ajax,php,和css
  4. DeepLearning.ai学习笔记(五)序列模型 -- week2 序列模型和注意力机制
  5. 【原创】大叔经验分享(4)Yarn ResourceManager页面如何实现主被自动切换
  6. Spring MVC详解
  7. 20 常用模块 hashlib hmac:加密 xml xlrd xlwt:excel读|写 configparser subprocess
  8. django模型层优化(关联对象) 懒加载和预加载 +长链接
  9. 树dp:边覆盖,点覆盖
  10. hiveserver2启动成功但无法通过beeline连接