📅  最后修改于: 2023-12-03 15:12:22.413000             🧑  作者: Mango
本套题包含多个涉及递归的问题,旨在帮助程序员练习递归算法,提高编程技能。以下是每个问题的详细说明。
斐波那契数列是一个非常常见的数列,它的前两个数为 0 和 1,从第三个数开始,每个数都是前两个数之和。例如,前十个斐波那契数列为 0, 1, 1, 2, 3, 5, 8, 13, 21, 34。
请你使用递归算法,编写一个函数,计算斐波那契数列的第 n 个数。
def fibonacci(n: int) -> int:
if n < 2:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
阶乘是指从 1 到 n 的所有整数相乘的积,通常表示为 n!。例如,5! = 1x2x3x4x5 = 120。
请你使用递归算法,编写一个函数,计算 n 的阶乘。
def factorial(n: int) -> int:
if n == 0:
return 1
else:
return n * factorial(n-1)
汉诺塔是一种著名的递归问题,其基本形式是:有三个杆子 A、B、C。开始时,在 A 杆子上自下而上按从大到小的顺序放置了 n 个圆盘。现在要将这些圆盘移到 C 杆子上,其中可以借助 B 杆子。移动时有如下规则:
请你使用递归算法,编写一个函数,计算将 n 个圆盘从 A 杆子移到 C 杆子需要的步数。
def hanoi(n: int, A: str, B: str, C: str) -> int:
if n == 1:
print(f"Move disk 1 from {A} to {C}")
return 1
else:
step_1 = hanoi(n-1, A, C, B)
print(f"Move disk {n} from {A} to {C}")
step_2 = hanoi(n-1, B, A, C)
return step_1 + 1 + step_2
给定一棵二叉树,其节点结构为:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
现在,请你使用递归算法,分别实现二叉树的前序、中序、后序遍历。
def preorder(root: TreeNode) -> List[int]:
res = []
if root:
res.append(root.val)
res += preorder(root.left)
res += preorder(root.right)
return res
def inorder(root: TreeNode) -> List[int]:
res = []
if root:
res += inorder(root.left)
res.append(root.val)
res += inorder(root.right)
return res
def postorder(root: TreeNode) -> List[int]:
res = []
if root:
res += postorder(root.left)
res += postorder(root.right)
res.append(root.val)
return res
以上就是本套递归练习问题的详细介绍,希望对程序员们的编程接下来的编程实践有所帮助!