zoukankan      html  css  js  c++  java
  • 第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))
  • 相关阅读:
    刷题总结——跳蚤(poj1091容斥+分解质因数)
    刷题总结——分糖(ssoj 容斥原理+逆元+快速幂+组合数求插板)
    刷题总结——旅馆(bzoj1593线段树)
    刷题总结——树的同构(bzoj4337 树上hash)
    刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)
    刷题总结——松鼠的新家(bzoj3631)
    mysql备份与恢复
    nginx添加用户验证(访问服务器是的用户名密码)
    df命令
    org.mongodb.morphia.query.QueryException: sorting is not allowed for updates.
  • 原文地址:https://www.cnblogs.com/luoxun/p/13345819.html
Copyright © 2011-2022 走看看