python常见递归题练习

函数递归的定义

递归是指一个函数在执行过程中不断调用自身,直至满足某个条件退出。在Python中,递归函数需要包含一个基本情况,即退出条件,否则会一直调用自身导致无限循环。递归函数可以用于解决某些问题,比如遍历树或搜索算法。然而,递归函数可能会导致栈溢出或效率低下。因此,在使用递归函数时需要小心并特别注意。

常见题型

有一群猴子,去摘了一堆桃子,商量之后决定每天吃剩余桃子的一半。可是当每天大家吃完桃子之后,有个贪心的小猴都会偷偷再吃一个桃子。按照这样的方式猴子们每天都快乐的吃着桃子,直到第十天,当大家再想吃桃子时,发现只剩下一个桃子了。

问:猴子们一共摘了多少桃子?

要求 1.使用递归思想编程

2. 提供代码截图和运行结果截图

3.运行结果要由“猴子们一共摘了**个桃子”类似的语句组成

def count_peaches(day, peach):
    if day == 1:
        return peach
    else:
        return count_peaches(day-1, (peach+1)*2)

peach_num = count_peaches(10, 1)
print("猴子们一共摘了{}个桃子".format(peach_num))

杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。杨辉三角形中的数是(x+y)的N次幂的展开式各项系数。杨辉三角的第n行有n个元素,其中首尾两个元素为1,中间每个元素等于上一行对应的两个元素之和。

请根据用户给出的行数(行数>5)打印出相应的杨辉三角.

要求1.使用递归思想编程

2. 提供代码截图和运行结果截图

3.运行结果开始要由“请输入需要输出的杨辉三角行数: ”类似的语句开始。

代码:

def pascal_triangle(n):
    if n == 1:
        return [[1]]
    else:
        triangle = pascal_triangle(n-1)
        row = [1]
        for i in range(1, n-1):
            row.append(triangle[-1][i-1] + triangle[-1][i])
        row.append(1)
        triangle.append(row)
        return triangle

n = int(input('请输入需要输出的杨辉三角行数:'))
triangle = pascal_triangle(n)
for row in triangle:
    print(' '.join(str(num) for num in row))

这道题可以参考

https://blog.csdn.net/m0_62338174/article/details/128557041?spm=1001.2014.3001.5501

年龄问题

有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。最后问第1个人,他说他是10岁。

请编写程序,输出所有人的对应的年龄(从第1个人开始)

要求 1.使用递归思想编程

2. 提供代码截图和运行结果截图

3.运行结果每行要由“第*个人的年龄为*”类似的语句组成

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

for i in range(1, 6):
    print("第%d个人的年龄为%d" % (i, get_age(i)))

A、B、C、D、E这5个⼈合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了。第二天日上三竿时,A 第⼀个醒来,他将鱼平分为5份,把多余的⼀条扔回河中,然后拿着自己的⼀份回家去了;B第二个醒来,但不知道A已经拿走了⼀份鱼,于是他将剩下的鱼平分为5份,扔掉多余的⼀条,然后只拿走了自己的⼀份;接着C、D、E依次醒来,也都按同样的办法分鱼。问这5人至少合伙捕到多少条鱼?每个人醒来后所看到的鱼是多少条?

要求 1.使用递归思想编程

2. 提供代码截图和运行结果截图

3.运行结果由“5个人至少合伙捕到**条鱼”和“第*个人醒来看到**条鱼”语句构成

def fish_count(people_count):
    if people_count == 1:
        return 5
    else:
        return (fish_count(people_count-1)*4)//5
    
for i in range(1, 6):
    print("第{}个人醒来看到{}条鱼".format(i, fish_count(i)))

print("5个人至少合伙捕到{}条鱼".format(fish_count(5)))

输入一个十进制整数,输出其对应的二进制数字

方法:用2整除十进制整数,得到一个商和余数;再用2去除商,又会得到一个商和余数,如此重复,直到商为小于1时为止,然后把先得到余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,以此排列起来。

要求 1.使用递归思想编程

2. 提供代码截图和运行结果截图

3.运行结果由“请输入一个整数:”和“其二进制数为:”语句构成

def decimalToBinary(n):
    if n >= 1:
        decimalToBinary(n // 2)
    print(n % 2, end='')


if __name__ == '__main__':
    decimal = int(input("请输入一个整数:"))
    print("其二进制数为:", end='')
    decimalToBinary(decimal)

最大公约数和最小公倍数

输入两个整数 a和b,输出它们的最大公约数

注:求最大公约数可以使用辗转相除法:

假设a>b>0,那么a和b的最大公约数等于b和a%b的最大公约数,然后把b和a%b作为新一轮的输入。直到a%b等于0的时候,b的值就是所要求的最大公约数。

最小公倍数思路:(1)最小公倍数=a*b/最大公约数

(2)从1开始递增寻找第一个,既能整除a,也能整除b的整数

要求 1.使用递归思想编程

2. 提供代码截图和运行结果截图

3.运行结果由“请输入一个正整数:”、“请输入第二个正整数:”、“**和**的最大公约数为**”和“**和**的最小公倍数为**”语句构成

def gcd(a, b):
    if b == 0:
        return a
    return gcd(b, a % b)

def lcm(a, b):
    return a * b // gcd(a, b)

num1 = int(input("请输入第一个正整数:"))
num2 = int(input("请输入第二个正整数:"))

gcd_result = gcd(num1, num2)
lcm_result = lcm(num1, num2)

print(f"{num1}和{num2}的最大公约数为{gcd_result}")
print(f"{num1}和{num2}的最小公倍数为{lcm_result}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值