问题 A: 骨牌覆盖
题目描述
用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:
输入
多组测试用例,每一组是一个正整数。
输出
每组输出占一行。
只需要输出铺放方案总数,不需要输出具体的铺放方案。
样例输入 Copy
3
样例输出 Copy
3
def gujia(n):
i = 0
if n == 1:
i = 1
elif n == 2:
i =2
else:
i = gujia(n-1) + gujia(n-2)
return i
while True:
num = int(input())
print(gujia(num))
问题 B: 蜂房
题目描述
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
输入
多组数据输入,每组数据包含两个正整数a, b,且 a<b。
输出
蜜蜂从蜂房a爬到蜂房b的可能路线数。
样例输入 Copy
1 2 3 4
样例输出 Copy
1 1
def bee(n):
i = 0
if n == 1:
i = 1
elif n == 2:
i =2
else:
i = bee(n-1) + bee(n-2)
return i
while True:
a,b = map(int,input().split(" "))
num = b - a
print(bee(num))
问题 C: 递归求和
题目描述
使用递归编写一个程序求如下表达式的计算结果: (1<n<=20)
S(n) = 1*4 + 4*9 + 9*16 + 16*25 + ... + ((n-1)^2)*n^2
输入n,输出表达式S(n)的结果。
输入
单组输入,输入一个正整数n,1<n<=20。
输出
输出表达式S(n)的计算结果。
样例输入 Copy
3
样例输出 Copy
40
def S(n):
if n ==1:
return 0
else:
return S(n-1)+((n-1)*(n-1))*(n*n)
num = int(input())
print(S(num))
问题 D: 简单递归
题目描述
请使用递归编写一个程序求如下表达式的计算结果:
S(1) = 1/2
S(2) = 1/2 - 1/6
S(3) = 1/2 - 1/6 + 1/12
S(4) = 1/2 - 1/6 + 1/12 - 1/20
......
S(n) = 1/2 - 1/6 + 1/12 - 1/20 + 1/30 + ......
输入n (1<n<=100),输出表达式S(n)的值(四舍五入,精确到小数点后六位)。
请编写一个递归程序实现该功能。
输入
单组输入,输入一个正整数n,1<n<=100。
输出
输出表达式S(n)的计算结果(四舍五入,精确到小数点后六位)。
样例输入 Copy
2
样例输出 Copy
0.333333
def S(n):
if n == 1:
return 1/2
else :
sign = 1 if n % 2 == 1 else -1
fenmu = n * (n + 1)
return S(n-1) + sign / fenmu
num = int(input())
ans = S(num)
#四舍五入不推荐用round函数,round四舍六入五凑偶
print('%.6f'%ans)
问题 E: 填放金币
题目描述
X星人在一艘海底沉船上发现了很多很多很多金币,可爱的X星人决定用这些金币来玩一个填格子的游戏。
其规则如下:第1个格子放2枚金币,第2个格子放5枚金币,第3个格子放10枚金币,第4个格子放17枚金币,第5个格子放26枚金币,以此类推。
请问放到第n个格子时一共放了多少枚金币?
请用递归编写一个程序统计第1个格子到第n个格子的总金币数量。
【友情提醒:请使用递归来实现】
输入
多组输入。每组一个正整数n,表示最后一个格子的编号。(n<=100)
输出
对于每一组输入,输出从第1个格子到第n个格子的总金币数。
样例输入 Copy
1 3
样例输出 Copy
2 17
def S(n):
if n == 1:
return 2
else :
return S(n-1) +2 * n - 1
while True:
num = int(input())
ans = 0
for i in range(1, num+1):
ans += S(i)
print(ans)
问题 F: X星人的数列
题目描述
爱冒险的X星人在一艘海底沉船上发现了一串神秘数列,这个数列的前6项如下:
0 1 3 7 15 31
X星人对这串数列产生了浓厚的兴趣,他希望你能够帮他发现这个神秘数列中所蕴含的规律,并且使用递归来编写一个程序输出该数列前N项的和。
当输入一个正整数N时,请输出这个神秘数列前N项的和。
输入
单组输入,每组输入一个正整数N(N<=20)。
输出
输出一个正整数,对应这个神秘数列前N项的和。
样例输入 Copy
6
样例输出 Copy
57
def S(n):
if n == 1:
return 0
else :
return S(n-1) + 2 ** (n-2)
num = int(input())
ans = 0
for i in range(1, num+1):
ans += S(i)
print(ans)
问题 G: 倒序输出
题目描述
使用递归编写一个程序,逆序输出一个非负整数。例如输入1234,输出4321(不含前导0)。
输入
多组输入,每组输入一个非负整数。
输出
逆序输出结果,每个结果占一行。
样例输入 Copy
12 1230 0
样例输出 Copy
21 321 0
def reverse_print(num):
if num < 10:
print(num)
else:
print(num % 10, end='')
reverse_print(num // 10)
def ten(num):
if num < 10:
return num
if num % 10 != 0:
return num
else:
num = int(num/10)
return ten(num)
while True:
num = int(input())
num = int(ten(num))
reverse_print(num)
问题 H: 汉诺塔
题目描述
使用递归编写一个程序实现汉诺塔问题,要求在输入圆盘数量之后,输出圆盘的移动步骤,输出格式示例如下:
第1步:1号盘从A柱移至B柱
第2步:2号盘从A柱移至C柱
输入
输出
样例输入 Copy
3
样例输出 Copy
第1步:1号盘从A柱移至C柱 第2步:2号盘从A柱移至B柱 第3步:1号盘从C柱移至B柱 第4步:3号盘从A柱移至C柱 第5步:1号盘从B柱移至A柱 第6步:2号盘从B柱移至C柱 第7步:1号盘从A柱移至C柱
# 定义move函数,用于模拟移动盘子
def move(n, a, b):
global step
# 使用global关键字声明step为全局变量,以便在函数内部修改它的值
#如果用step = 0,则step+=1,无效,step将一直等于1
step += 1
print(f"第{step}步:{n}号盘从{a}柱移至{b}柱")
def hanoi(n, a, b, c):
# 如果盘子数量大于0,则继续递归操作
if n > 0:
# 将n-1个盘子从a柱移动到b柱,使用c柱作为辅助
hanoi(n - 1, a, c, b)
# 将剩下的一个盘子从a柱移动到c柱
move(n, a, c)
# 将b柱上的n-1个盘子移动到c柱,使用a柱作为辅助
hanoi(n - 1, b, a, c)
while True:
n = int(input())
step = 0
hanoi(n, 'A', 'B', 'C')
print("")