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

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

递归练习问题套装5

本套装是为了帮助程序员练习递归问题而设计的。套装包括了五个不同的递归问题,涵盖了不同的递归场景和难度级别。以下是问题的详细描述与解答:

问题1:斐波那契数列

斐波那契数列是以递归方式定义的数列,其中每个数都是前两个数的和。数列的前几项为:0, 1, 1, 2, 3, 5, 8, 13, 21...

实现一个函数,计算斐波那契数列的第n项。

def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)
问题2:阶乘

阶乘是一个自然数的乘积,例如3的阶乘为3x2x1=6。实现一个函数,求给定的自然数n的阶乘。

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
问题3:汉诺塔

汉诺塔是一种经典的数学问题,是递归思想的典型应用。有三根杆子,在第一根上自下而上按照大小顺序放置n个盘子,盘子最大的在最下面,最小的在最上面。将所有的盘子移动到第三根杆子上,并保证大盘子在小盘子下面。

def hanoi(n, a, b, c):
    if n == 1:
        print("Move disk 1 from %s to %s" % (a, c))
    else:
        hanoi(n-1, a, c, b)
        print("Move disk %s from %s to %s" % (n, a, c))
        hanoi(n-1, b, a, c)
问题4:字符串倒序

给定一个字符串,要求输出字符串的倒序。

def reverse_str(s):
    if len(s) == 1:
        return s
    else:
        return s[-1] + reverse_str(s[:-1])
问题5:二叉树的遍历

二叉树是一个有左右子树的树结构,可以用三种方式进行遍历:前序遍历、中序遍历、后序遍历。前序遍历是先遍历根节点,再遍历左子树和右子树;中序遍历是先遍历左子树,再遍历根节点和右子树;后序遍历是先遍历左子树和右子树,最后遍历根节点。

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def preorder_traversal(root):
    if root:
        print(root.val)
        preorder_traversal(root.left)
        preorder_traversal(root.right)

def inorder_traversal(root):
    if root:
        inorder_traversal(root.left)
        print(root.val)
        inorder_traversal(root.right)

def postorder_traversal(root):
    if root:
        postorder_traversal(root.left)
        postorder_traversal(root.right)
        print(root.val)

以上就是递归练习问题套装5的详细介绍和解答。希望这些问题能够帮助程序员深入理解递归思想,并提高递归编程技巧。