一 斐波那契数列
1 斐波那契数列原理
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。
2 具体实现
(1) 迭代实现
1 def fab(n): 2 n1 = 1 3 n2 = 1 4 n3 = 1 5 6 if n < 1: 7 print("输入有误!") 8 return -1 9 while (n-2)>0: 10 n3 = n2 + n1 11 n1 = n2 12 n2 = n3 13 n -= 1 14 return n3 15 16 num = int(input("请输入天数:")) 17 result = fab(num) 18 if result != -1: 19 print("总共有%d对小兔崽子诞生!" % result)
(2)递归实现
1 def Fib(n): 2 3 if n<0: 4 print("输入错误,请重新输入一个正数!") 5 return -1 6 elif n == 1 or n == 2: 7 return 1 8 else: 9 return Fib(n-1) + Fib(n-2) 10 11 num = int(input("请输入一个正数:")) 12 result = Fib(num) 13 if result != -1: 14 print(f"总共有{result}对小兔崽子诞生!")
二 汉诺塔游戏 https://www.cnblogs.com/dmego/p/5965835.html
代码实现
1 def hanoi(n,x,y,z): 2 if n == 1: 3 print(x,"-->",z) 4 else: 5 hanoi(n-1,x,z,y)# 将前n-1个盘子从x移动到y上 6 print(x,"-->",z) # 将最底下的最后一个盘子从x移动到z上 7 hanoi(n-1,y,x,z)# 将y上的n-1个盘子移动到z上 8 9 n = int(input("请输入汉诺塔的层数:")) 10 hanoi(n,'X','Y','Z')
三 课后作业
0. 使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式)。
我的代码:
1 def decToBin(div,listBin): 2 string = listBin 3 if div==0: 4 print(f"十进制{div} to 二进制0b{0000}") 5 return 0b0000 6 elif(div>0): 7 rem = div % 2 8 div2 = div // 2 9 rem1 = str(rem) 10 string = rem1 + string 11 # numBin = int(string) 12 if div2 == 0: 13 print(f"十进制{numDiv} to 二进制0b{string}") 14 return decToBin(div2,string) 15 else: 16 return -1 17 18 19 numDiv = int(input("请输入一个十进制数:")) 20 decToBin(div=numDiv,listBin='')
嗯,上述代码只考虑了正整数,没有考虑负数,所以代码不完善;并且我在把余数拼接成字符串的过程中,想用数列结果没有成功,可能是我哪里搞错了。还有我在程序里面定义了div2、rem和rem1三个变量,耗费了更多的存储空间。PS:我的代码好乱啊。。。。。
下面是小甲鱼的代码:
1 def Dec2Bin(dec): 2 result = '' 3 4 if dec: 5 result = Dec2Bin(dec//2) 6 return result + str(dec%2) 7 else: 8 return result 9 10 print(Dec2Bin(62))
下面三个题目来不及了,以后有时间仔细看。。。
1. 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1, 2, 3, 4, 5]
解题思路:利用除以10取余数的方式,每次调用get_digits(n//10),并将余数存放到列表中即可。要注意的是结束条件设置正确。
1 result = [] 2 def get_digits(n): 3 if n > 0: 4 result.insert(0, n%10) 5 get_digits(n//10) 6 7 get_digits(12345) 8 print(result)
2. 还记得求回文字符串那道题吗?现在让你使用递归的方式来求解,亲还能骄傲的说我可以吗?
解题思路:有好多种方法,不过综合效率来说,小甲鱼的实现方式比较朴素,利用递归每次索引前后两个字符进行对比,当start > end的时候,也正是首尾下标“碰面”的时候,即作为结束递归的条件。
1 def is_palindrome(n, start, end): 2 if start > end: 3 return 1 4 else: 5 return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0 6 7 string = input('请输入一串字符串:') 8 length = len(string)-1 9 10 if is_palindrome(string, 0, length): 11 print('"%s"是回文字符串!' % string) 12 else: 13 print('"%s"不是回文字符串!' % string)
3. 使用递归编程求解以下问题:
"有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?"
解题思路:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
1 def age(n): 2 if n == 1: 3 return 10 4 else: 5 return age(n-1) + 2 6 7 print('哈哈,我知道了,第五个人的年龄是 %d 岁,啵啵脆!' % age(5))