Python⼊门之经典函数实例——第1关:递归函数-汉诺塔的魅
任务描述
在Python函数内部,我们可以去调⽤其他函数。所以如果⼀个函数在内部调⽤⾃⾝,这个函数我们就称为递归函数。本关我们将以汉诺塔的例⼦来感受递归函数的⽅法与应⽤。
汉诺塔问题源于印度⼀个古⽼传说。相传⼤梵天创造世界的时候做了三根⾦刚⽯柱⼦,在⼀根柱⼦上从下往上按照⼤⼩顺序摞着64⽚黄⾦圆盘。⼤梵天命令婆罗门把圆盘从下⾯开始按⼤⼩顺序重新摆放在另⼀根柱⼦上。并且规定,任何时候,在⼩圆盘上都不能放⼤圆盘,且在三根柱⼦之间⼀次只能移动⼀个圆盘。问应该如何操作?
本关⽬标就是通过对汉诺塔问题的探讨,让读者了解并掌握递归函数的相关知识。
相关知识
在编程语⾔中,如果⼀种计算过程的其中每⼀步都会⽤到前⼀步或前⼏步的结果,这个计算过程就可以称为递归的。⽽⽤递归计算过程定义的函数,则被称为递归函数。递归函数应⽤很⼴泛,例如连加、连乘及阶乘等问题都可以利⽤递归思想来解决。⽽汉诺塔问题也是递归函数的经典应⽤。
汉诺塔问题的解决思路:如果我们要思考每⼀步怎么移可能会⾮常复杂,但是可以将问题简化。我们可以先假设除a柱最下⾯的盘⼦之外,已经成功地将a柱上⾯的63个盘⼦移到了b柱,这时我们只要再将最下⾯的盘⼦由a柱移动到c柱即可。
当我们将最⼤的盘⼦由a柱移到c柱后,b柱上便是余下的63个盘⼦,a柱为空。因此现在的⽬标就变成了将这63个盘⼦由b柱移到c柱。这个问题和原来的问题完全⼀样,只是由a柱换为了b柱,规模由64变为了63。因此可以采⽤相同的⽅法,先将上⾯的62个盘⼦由b柱移到a柱,再将最下⾯的盘⼦移到c柱。
以此内推,再以b柱为辅助,将a柱上⾯的62个圆盘最上⾯的61个圆盘移动到b柱,并将最后⼀块圆盘移到c柱。
check约束不能实现我们已经发现规律,我们每次都是以a或b中⼀根柱⼦为辅助,然后先将除了最下⾯的圆盘之外的其他圆盘移动到辅助柱⼦上,再将最底下的圆盘移到c柱⼦上,不断重复此过程。
这个反复移动圆盘的过程就是递归,例如我们每次想解决n个圆盘的移动问题,就要先解决(n-1)个盘⼦进⾏同样操作的问题。
我们先假设a柱上只有3个圆盘,利⽤Python进⾏编程实现圆盘的移动,代码如下:
def move(n, a, b, c):
if(n == 1):
print(a,"->",c)数据结构图书管理系统源代码
return
move(n-1, a, c, b)jsp文件怎么运行显示出来
move(1, a, b, c)
move(n-1, b, a, c)
move(3, "a", "b", "c")
函数运⾏结果:
2. a -> b
3. c -> b
4. a -> c
5. b -> a
6. b -> c
7. a -> c
程序分析:
⾸先我们定义了⼀个函数move(n,a,b,c),参数n代表a柱上的圆盘个数,a,b,c三个柱⼦的顺序代表要将a柱上的圆盘最终移动到c柱上,然后b柱作为中间柱。
我们在递归函数中肯定会有终⽌递归的条件,2到4⾏的代码就是表⽰当a柱上的圆盘个数为1的时,就中⽌递归并返回,因为此时a柱上⾯只有⼀个圆盘的时候肯定就是直接把圆盘从a柱移动到c柱了。
第5⾏的代码move(n-1, a, c, b)表⽰先得把a柱上的n-1个圆盘从a柱移动到b柱,这时c柱是中间辅助柱。
第6⾏的代码move(1, a, b, c)就是条件n=1的时候,表⽰把a柱上剩下的1个最⼤圆盘从a柱移动到c柱。
第7⾏的代码move(n-1, b, a, c)表⽰现在n-1个圆盘转移到要b柱上了,还是递归调⽤move函数,将n-1个圆盘从b柱移动到c柱,这时a柱是中间辅助柱。
最后我们调⽤move函数将3个圆盘从a柱移动到到c柱,当移动64个圆盘时,只需要将调⽤函数move(n,a,b,c)中的n变为64即可,这个计算量是⼗分巨⼤的,也只能交给计算机去解决。
⼩结:
我们通过汉诺塔的例⼦感受了递归函数的基本思路,并尝试解决了⼀个具体问题。递归函数的优点是定义清晰,思路简洁,能够极⼤简化编程过程。理论上,所有的递归函数都可以⽤循环的⽅法代替,但循环⽅法的编程过程要⽐递归函数复杂很多。
编程要求
本关的编程任务是补全src/step1/recursive.py⽂件的代码,实现相应的功能。具体要求如下:
定义⼀个函数fact(n),实现的功能是对输⼊的正整数n进⾏n!运算。
调⽤函数fact(n),对输⼊的正整数n进⾏阶乘运算,并输出计算结果。
测试说明
oracle数据库有哪些版本本关的测试⽂件是src/step1/recursive.py,测试过程如下:
1. 平台⾃动编译⽣成;
2. 平台运⾏,并以标准输⼊⽅式提供测试输⼊;
3. 平台获取输出,并将其输出与预期输出对⽐。如果⼀致则测试通过,否则测试失败。
以下是平台对src/step1/recursive.py的样例测试集:
测试输⼊:
5
预期输出:
120
测试输⼊:
6
预期输出:
720
7
预期输出:
5040
测试输⼊:
8
预期输出:
40320
开始你的任务吧,祝你成功!
梦虽虚幻,却是⾃⼰的梦想;位虽低微,却是⾃⼰的岗位;屋虽简陋,却是⾃⼰的家;志虽渺⼩,却是⾃⼰的追求。如果你觉得这⼀关的内容对你有帮助,请你在下⾯点赞。
参考答案
#coding=utf-8
#输⼊正整数n
n = int(input())
# 请在此添加代码,实现n!
#********** Begin *********#
python基础代码实例
def fact(n):
javascript arraybuffer
if n == 1:
res = 1
else:
res = n * fact(n - 1)
return res
print(fact(n))
#********** End **********#