实验7 函数设计与使用

        一、假设一段楼梯共15个台阶,小明一步最多能上3个台阶。编写程序计算小明上这段楼梯一共有多少种方法。要求给出递推法和递归法两种代码。
从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一步迈2个台阶上来,从第12个台阶上一步迈3个台阶上来),同理,第14个、13个、12个台阶都可以这样推算,从而得到递归公式f(n) = f(n-1) + f(n-2) + f(n-3),其中n=15、14、13、...、5、4。然后就是确定这个递归公式的结束条件了,第一个台阶只有1种上法,第二个台阶有2种上法(一步迈2个台阶上去、一步迈1个台阶分两步上去),第三个台阶有4种上法(一步迈3个台阶上去、一步2个台阶+一步1个台阶、一步1个台阶+一步2个台阶、一步迈1个台阶分三步上去)。

def count_ways_stairs(n):
    if n == 1:
        return 1
    elif n == 2:
        return 2
    elif n == 3:
        return 4
    a, b, c = 1, 2, 4
    for i in range(4, n + 1):
        total = a + b + c
        a, b, c = b, c, total

    return c

n = 15
print("共有", count_ways_stairs(n), "种方法")
def count_ways_stairs_recursive(n):
    if n == 1:
        return 1
    elif n == 2:
        return 2
    elif n == 3:
        return 4
    return (count_ways_stairs_recursive(n - 1) +
            count_ways_stairs_recursive(n - 2) +
            count_ways_stairs_recursive(n - 3))
n = 15
print("共有", count_ways_stairs_recursive(n), "种方法")

二、编写程序,模拟抓狐狸小游戏。假设一共有一排5个洞口,小狐狸最开始的时候在其中一个洞口,然后玩家随机打开一个洞口,如果里面有狐狸就抓到了。如果洞口里没有狐狸就第二天再来抓,但是第二天狐狸会在玩家来抓之前跳到隔壁洞口里。如果在规定的次数内抓到了狐狸就提前结束游戏并提示成功;如果规定的次数用完还没有抓到狐狸,就结束游戏并提示失败。

import random

def game():
    fox = random.randint(0, 4)
    return fox

def move_fox(current):
    if current == 0:
        return current + 1
    elif current == 4:
        return current - 1
    else:
        return current + random.choice([-1, 1])

def play(attempts):
    fox = game()
    print("狐狸在洞口的初始位置:", fox_position)

    for attempt in range(attempts):
        print(f"\n第 {attempt + 1} 次抓狐狸")
        guess = int(input("请输入要打开的洞口(0-4): "))

        if guess == fox:
            print("恭喜你,抓到狐狸了!")
            return

        print("没有抓到狐狸,狐狸跑了!")
        fox = move_fox(fox)
        print("狐狸跳到另一个洞口!")

    print("\n很遗憾,所有机会都用完了。游戏结束。")

total_attempts = 10
play(total_attempts)

三、据说古代有一个梵塔,塔内有三个底座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子。在移动盘子的过程中可以利用B座,但任何时刻3个座上的盘子都必须始终保持大盘在下、小盘在上的顺序。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C即可。
编写函数,接收一个表示盘子数量的参数和分别表示源、目标、临时底座的参数,然后输出详细移动步骤和每次移动后三个底座上的盘子分布情况。

def hanoi(n, source, target, auxiliary, source_tower, target_tower, auxiliary_tower):
    if n == 1:
        disk = source_tower.pop()
        target_tower.append(disk)
        print(f"移动盘子 {disk} 从 {source} 到 {target}")
        print_towers(source, source_tower, target, target_tower, auxiliary, auxiliary_tower)
    else:
        hanoi(n-1, source, auxiliary, target, source_tower, auxiliary_tower, target_tower)
        disk = source_tower.pop()
        target_tower.append(disk)
        print(f"移动盘子 {disk} 从 {source} 到 {target}")
        print_towers(source, source_tower, target, target_tower, auxiliary, auxiliary_tower)
        hanoi(n-1, auxiliary, target, source, auxiliary_tower, target_tower, source_tower)

def print_towers(source, source_tower, target, target_tower, auxiliary, auxiliary_tower):
    print(f"{source} 底座: {source_tower}")
    print(f"{target} 底座: {target_tower}")
    print(f"{auxiliary} 底座: {auxiliary_tower}")
    print("----------------------------")

n = 64
source = 'A'
target = 'C'
auxiliary = 'B'
source_tower = list(range(n, 0, -1))
auxiliary_tower = []

print("初始状态:")
print_towers(source, source_tower, target, target_tower, auxiliary, auxiliary_tower)
hanoi(n, source, target, auxiliary, source_tower, target_tower, auxiliary_tower)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值