递归:这帮小兔子崽子、汉诺塔游戏+习题复习

##坑爹的兔子
在这里插入图片描述

##斐波那契数列的迭代实现
           ※我们都知道兔子繁殖能力是惊人的,如下图:
在这里插入图片描述
           ※我们可以用数学函数来定义:
在这里插入图片描述
           ※课间练习:假设我们需要求出经历了20个月后,总共有多少对小兔崽子?(迭代 vs 递归)

def fab(n):
    n1 = 1
    n2 = 1
    n3 = 1

    if n < 1:
        print('输入有误!')
        return -1

    while (n-2) > 0:
        n3 = n2 + n1
        n1 = n2
        n2 = n3
        n -= 1
    
    return n3

result = fab(45)
if result != -1:
    print('总共有%d对小兔崽子诞生!' % result)

在这里插入图片描述

##斐波那契数列的递归实现
在这里插入图片描述

def fab(n):
    if n < 1:
        print('输入有误!')
        return -1

    if n == 1 or n == 2:
        return 1
    else:
        return fab(n-1) + fab(n-2)

result = fab(35)
if result != -1:
    print('总共有%d对小兔崽子诞生!' % result)

在这里插入图片描述
##递归求解汉诺塔
在这里插入图片描述
           ※对于游戏的玩法,我们可以简单分解为三个步骤
              —将前63个盘子从X移动到Y上。
              —将最底下的第64个盘子从X移动到Z上。
              —将Y上的63个盘子移动到Z上。
           ※问题一:将X上的63个盘子借助Z移到Y上;
           ※问题二:将Y上的63个盘子借助X移到Z上。

           ※问题一(“将X上的63个盘子借助Z移到Y上”)拆解为:
              —将前62个盘子从X移动到Z上
              —将最底下的第63个盘子移动到Y上。
              —将Z上的62个盘子移动到Y上。

           ※问题二(“将Y上的63个盘子借助X移到Z上”)拆解为:
              —将前62个盘子从Y移动到X上
              —将最底下的第63个盘子移动到Z上。
              —将X上的62个盘子移动到Y上。

def hanoi(n, x, y, z):
    if n == 1:
        print(x, ' --> ', z)
    else:
        hanoi(n-1, x, z, y) # 将前n-1个盘子从x移动到y上
        print(x, ' --> ', z) # 将最底下的最后一个盘子从x移动到z上
        hanoi(n-1, y, x, z) # 将y上的n-1个盘子移动到z上

n = int(input('请输入汉诺塔的层数:'))
hanoi(n, 'X', 'Y', 'Z')

在这里插入图片描述
##动动手
           0. 使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式)。
           

def Dec2Bin(dec):
    result = ""

    if dec:
        result = Dec2Bin(dec//2)
        return result + str(dec %2 )
    else:
        return result

print(Dec2Bin(62))

在这里插入图片描述

            1. 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。
           举例:get_digits(12345) ==> [1, 2, 3, 4, 5]
           解题思路:利用除以10取余数的方式,每次调用get_digits(n//10),并将余数存放到列表中即可。要注意的是结束条件设置正确。
           

result = []
def get_digits(n):
    if n > 0:
        result.insert(0,n % 10)
        get_digits(n // 10)

get_digits(12345)
print(result)

在这里插入图片描述

            2. 还记得求回文字符串那道题吗?现在让你使用递归的方式来求解,亲还能骄傲的说我可以吗?
           解题思路:有好多种方法,不过综合效率来说,小甲鱼的实现方式比较朴素,利用递归每次索引前后两个字符进行对比,当start > end的时候,也正是首尾下标“碰面”的时候,即作为结束递归的条件。
           

def is_palindrome(n, start, end):
        if start > end:
                return 1     
        else:
                return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0
        
string = input("请输入一串字符串:")
length = len(string)-1
 
if is_palindrome(string,0,length):
        print('"%s"是回文字符串!' % string)
else:
        print('"%s"不是回文字符串!'% string)

            3. 使用递归编程求解以下问题:
            有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

           解题思路:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
           

def age(n):
    if n == 1:
        return 10
    else:
        return age(n-1) + 2

print('哈哈,我知道了,第五个人的年龄是 %d 岁,啵啵脆!' % age(5))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用递归来模拟汉诺塔游戏时,要定义一个函数来实现移动盘子的操作。下面是使用Python递归模拟汉诺塔游戏的示例代码: ```python def hanoi(n, source, target, auxiliary): if n > 0: # 将 n-1 个盘子从源柱移动到辅助柱 hanoi(n-1, source, auxiliary, target) # 将最大的盘子从源柱移动到目标柱 print(f"将盘子 {n} 从 {source} 移动到 {target}") # 将 n-1 个盘子从辅助柱移动到目标柱 hanoi(n-1, auxiliary, target, source) # 示例 n = 3 # 盘子的数量 source = "A" # 源柱 target = "C" # 目标柱 auxiliary = "B" # 辅助柱 hanoi(n, source, target, auxiliary) ``` 在上述代码中,`hanoi` 函数接受四个参数 `n`、`source`、`target` 和 `auxiliary`。其中,`n` 表示盘子的数量,`source` 表示源柱,`target` 表示目标柱,`auxiliary` 表示辅助柱。 函数内部使用递归的方式来实现汉诺塔游戏的移动操作。首先,通过递归调用 `hanoi(n-1, source, auxiliary, target)` 将 n-1 个盘子从源柱移动到辅助柱。然后,将最大的盘子从源柱移动到目标柱,并打印移动的过程。最后,通过递归调用 `hanoi(n-1, auxiliary, target, source)` 将 n-1 个盘子从辅助柱移动到目标柱。 以上代码输的结果为: ``` 将盘子 1 从 A 移动到 C 将盘子 2 从 A 移动到 B 将盘子 1 从 C 移动到 B 将盘子 3 从 A 移动到 C 将盘子 1 从 B 移动到 A 将盘子 2 从 B 移动到 C 将盘子 1 从 A 移动到 C ``` 这样,我们就使用递归成功模拟了汉诺塔游戏的移动过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值