第23~24讲:这帮小兔崽子(斐波那契数列)和汉诺塔游戏

一 斐波那契数列

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))
posted @ 2020-07-20 16:31  洛兰123  阅读(414)  评论(0编辑  收藏  举报