递归函数练习题
学生年龄问题
题目描述
有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。问第4个学生岁数,他说比第3个学生大2岁。问第3个学生,又说比第2个学生大2岁。问第2个学生,说比第1个学生大2岁。最后问第1个学生,他说是10岁。请问第5个学生多大。
输出示例
输入:5
输出:18
实现代码
def student_age(n):"""计算第n个学生的年龄参数:n -- 学生编号(从1开始)返回:第n个学生的年龄"""# 基本情况if n == 1:return 10# 递归情况else:return student_age(n - 1) + 2# 测试
print(student_age(5)) # 输出: 18
1到N的累加
题目描述
用递归的方法求1+2+3+……+N的值。
输出示例
输入:5
输出:15
实现代码
def sum_to_n(n):"""计算从1到n的自然数之和(递归版本)参数:n -- 正整数返回:1到n的自然数之和"""# 基本情况if n == 1:return 1# 递归情况else:return n + sum_to_n(n - 1)# 测试
print(f"1到5的和: {sum_to_n(5)}") # 输出: 15
斐波那契数列
题目描述
用递归函数输出斐波那契数列第n项。0,1,1,2,3,5,8,13……
输出示例
输入:3
输出:1
实现代码
def fibonacci(n):if n == 1:return 0elif n == 2:return 1# 递归情况else:return fibonacci(n - 1) + fibonacci(n - 2)# 测试
print(f"fibonacci(3) = {fibonacci(3)}") # 输出: 1
阿克曼(Ackmann)函数
题目描述
阿克曼(Ackmann)函数A(m,n)中,m,n定义域是非负整数(m≤3,n≤10),函数值定义为:
示例
print(akm(2, 3)) # 输出: 9
实现代码
def ackermann(m, n):# 输入验证if m < 0 or n < 0:raise ValueError("m和n必须是非负整数")if m > 3 or n > 10:raise ValueError("超出定义域:m ≤ 3, n ≤ 10")# 基本情况1: m = 0if m == 0:return n + 1# 基本情况2: m > 0 且 n = 0elif m > 0 and n == 0:return ackermann(m - 1, 1)# 递归情况: m > 0 且 n > 0else:return ackermann(m - 1, ackermann(m, n - 1))print(ackermann(2, 3)) # 输出: 9
汉诺塔问题
题目描述
编写一个递归函数来解决汉诺塔问题。汉诺塔问题是将 n 个盘子从源柱 A 移动到目标柱 C,借助辅助柱 B,移动过程中需要遵守以下规则:
每次只能移动一个盘子
任何时候大盘子不能放在小盘子上面
输出示例
输入:n = 3
输出:移动步骤序列
实现代码
def hanoi(n, source, target, auxiliary):"""解决汉诺塔问题参数:n -- 盘子数量source -- 源柱名称target -- 目标柱名称auxiliary -- 辅助柱名称"""if n == 1:print(f"移动盘子 1 从 {source} 到 {target}")return# 将 n-1 个盘子从源柱移动到辅助柱hanoi(n - 1, source, auxiliary, target)# 将最大的盘子从源柱移动到目标柱print(f"移动盘子 {n} 从 {source} 到 {target}")# 将 n-1 个盘子从辅助柱移动到目标柱hanoi(n - 1, auxiliary, target, source)# 测试
print("汉诺塔问题,3个盘子:")
hanoi(3, 'A', 'C', 'B')

