Python基础练习
#8斐波那契数列(递归)
"""
兔子繁殖问题
假设:一对兔子出生两个月后就成年,并且成年之后(第三个月开始)每个月都能生出一对兔子来,并且它们能一直繁殖下去,生出来的兔子成年后也可也一直繁殖,不计算兔子的死亡。以此类推,N个月之后,总共有多少对兔子?
用列举法就可以简单地得出其中的规律:
从第三个月起,兔子的对数为前两个月兔子对数的和。
时间/月 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
数量/对 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 |
斐波那契数列可以用循环迭代的方法实现,但是 用递归的方法显然代码量要少得多,而且整个过程也更加容易理解!
"""
#代码:
import syssys.setrecursionlimit(1000000)defF(n): if n==1 or n==2:#递归须有结束条件 return 1 elif 150: return F(n-1)+F(n-2) else: return("输入值错误或者超出计算范围!\n")t=1while t==1: try: n = int(input("请输入要求兔子对数的时间(月份):")) num = F(n) if 0100: print(n,"个月后,兔子的对数总共有:",num,"\n\n") else: print(F(n)) t=int(input("\n1键继续,其他任意数字键退出:")) except: print("输入错误!!!\n\n")print("\n已退出程序!")
#----------------------------------------------------------------
#9汉诺塔问题(递归)
"""
问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时做了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,只能移动在最顶端的圆盘。
也就是将A杆中的所有圆盘借助B杆移到C杆上,每根杆上的每个圆盘都遵循:从下到上按照由大到小的顺序层叠,并且一次只能移动一个圆盘。
分析:
如A杆有n个圆盘:
n=1:A1→C(A1为A柱最底下的那个圆盘)
将1个盘移到C杆,直接移到C杆
n=2:A2→B,A1→C,B→C
将2个盘移到C杆,首先要将前1移到B杆
n=3:A3→C,A2→B,C→B,A1→C,B2→A,B1→C,A→C
将3个盘移到C杆,首先要将前2移到B杆,前1个移到C杆
n=4:A4→B,A3→C,B→C,A2→B,C→A,C→B,A→B,A1→C,B3→C,B2→A,C→A,B1→C,A2→B,A1→C,B→C
将4个移到C杆,首先要将前3到B杆,前2个移到C杆,前1个移到B杆
将n个移到C杆,首先要将前n-1到B杆,前n-2个移到C杆,……
"""
#代码:
count = 0def fun(n,A,B,C): if n==1: #声明全局变量 global count count +=1 print(count,":",A,"→",C) else: #将(n-1个盘从A柱借助C柱移到B柱) fun(n-1,A,C,B) count +=1 #直接将最底下的盘移到C柱 print(count,":",A,"→",C) #将(n-1个盘从B柱借助A柱移到C柱) fun(n-1,B,A,C) while True: n=int(input("请输入汉诺塔的层数:")) fun(n,"A","B","C") count = 0 print("移动次数:",2**n-1,"\n")
运行结果:
下图为递归图解汉诺塔的过程:
汉诺塔的移动次数可以用数学公式来表达:F(n)=2²-1。
递归就很好地解决了汉诺塔的求解过程,Python的递归不求完全理解递归的每一步,只需要懂得递归的思想即可!
#----------------------------------------------------------------
# 10-输入多个变量a,b,c,d = map(str,input("请分别输入4个值,用逗号分开:").split(","))print("a =",a,"\nb =",b,"\nc =",c,"\nd =",d)
更多精彩请点击
1.【Python】Python入门之软件安装
2.【Python】小白学习笔记1
3.【WiFi】如何用电脑创建免费WiFi
4.【微信】这些技巧和功能你都知道吗?
5.【安全】使用BitLocker加密U盘
既然在看了,就点一下吧!!