📜  递归练习问题套装6(1)

📅  最后修改于: 2023-12-03 15:12:22.413000             🧑  作者: Mango

递归练习问题套装6

本套题包含多个涉及递归的问题,旨在帮助程序员练习递归算法,提高编程技能。以下是每个问题的详细说明。

1. 斐波那契数列

斐波那契数列是一个非常常见的数列,它的前两个数为 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)
2. 阶乘

阶乘是指从 1 到 n 的所有整数相乘的积,通常表示为 n!。例如,5! = 1x2x3x4x5 = 120。

请你使用递归算法,编写一个函数,计算 n 的阶乘。

def factorial(n: int) -> int:
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
3. 汉诺塔

汉诺塔是一种著名的递归问题,其基本形式是:有三个杆子 A、B、C。开始时,在 A 杆子上自下而上按从大到小的顺序放置了 n 个圆盘。现在要将这些圆盘移到 C 杆子上,其中可以借助 B 杆子。移动时有如下规则:

  1. 每次只能移动一个盘子
  2. 盘子可以放在空杆子或者比它自身大的盘子上

请你使用递归算法,编写一个函数,计算将 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
4. 二叉树的遍历

给定一棵二叉树,其节点结构为:

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

以上就是本套递归练习问题的详细介绍,希望对程序员们的编程接下来的编程实践有所帮助!