2024年春季学期《算法分析与设计》练习2(计科和信管)

问题 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柱

 

输入
多组测试用例,每组输入一个正整数n,n代表圆盘数量。
输出
每组输出之间有一行空行。
 
样例输入 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("")

  • 48
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值