一、假设一段楼梯共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)