首页 > 编程语言 >Python中15个递归函数经典案例解析

Python中15个递归函数经典案例解析

时间:2024-08-03 15:58:53浏览次数:15  
标签:arr return 递归 递归函数 Python print 15 def row

在这里插入图片描述

1. 阶乘计算

阶乘是一个常见的递归应用,定义为n! = n * (n-1) * … * 1。

def factorial(n):  
    if n == 0:  
        return 1  
    else:  
        return n * factorial(n - 1)  
  
print(factorial(5))  # 输出: 120  

2. 斐波那契数列

斐波那契数列的每一项都是前两项的和。

def fibonacci(n):  
    if n <= 1:  
        return n  
    else:  
        return fibonacci(n - 1) + fibonacci(n - 2)  
  
print(fibonacci(10))  # 输出: 55  

3. 汉诺塔问题

汉诺塔是一个经典的递归问题,涉及将多个盘子从一个柱子移动到另一个柱子。

def hanoi(n, source, target, auxiliary):  
    if n > 0:  
        hanoi(n - 1, source, auxiliary, target)  
        print(f"Move disk {n} from {source} to {target}")  
        hanoi(n - 1, auxiliary, target, source)  
  
hanoi(3, 'A', 'C', 'B')  

4. 幂运算

计算a的n次方。

def power(a, n):  
    if n == 0:  
        return 1  
    elif n % 2 == 0:  
        return power(a * a, n // 2)  
    else:  
        return a * power(a, n - 1)  
  
print(power(2, 10))  # 输出: 1024  

5. 数组求和

递归地计算数组元素的总和。

def array_sum(arr):  
    if not arr:  
        return 0  
    else:  
        return arr[0] + array_sum(arr[1:])  
  
print(array_sum([1, 2, 3, 4]))  # 输出: 10  

6. 字符串反转

使用递归来反转字符串。

def reverse_string(s):  
    if len(s) <= 1:  
        return s  
    else:  
        return reverse_string(s[1:]) + s[0]  
  
print(reverse_string("hello"))  # 输出: "olleh"  

7. 找出数组中的最大值

递归地找出数组中的最大值。

def find_max(arr):  
    if len(arr) == 1:  
        return arr[0]  
    else:  
        sub_max = find_max(arr[1:])  
        return arr[0] if arr[0] > sub_max else sub_max  
  
print(find_max([3, 1, 4, 1, 5, 9]))  # 输出: 9  

8. 二叉树遍历

递归地遍历二叉树。

class Node:  
    def __init__(self, val, left=None, right=None):  
        self.val = val  
        self.left = left  
        self.right = right  
  
def inorder_traversal(node):  
    if node is not None:  
        inorder_traversal(node.left)  
        print(node.val, end=" ")  
        inorder_traversal(node.right)  
  
root = Node(1, Node(2), Node(3))  
inorder_traversal(root)  # 输出: 2 1 3  

9. 平衡括号检查

检查字符串中的括号是否平衡。

def balanced_parentheses(s):  
    if not s:  
        return True  
    if s[0] == '(' and s[-1] == ')':  
        return balanced_parentheses(s[1:-1])  
    else:  
        return False  
  
print(balanced_parentheses("(())"))  # 输出: True  

10. 帕斯卡三角形

生成帕斯卡三角形。

def pascals_triangle(n):  
    if n == 1:  
        return [1]  
    else:  
        row = [1]  
        prev_row = pascals_triangle(n - 1)  
        for i in range(len(prev_row) - 1):  
            row.append(prev_row[i] + prev_row[i + 1])  
        row.append(1)  
        return row  
  
for i in range(1, 6):  
    print(pascals_triangle(i))  

11. 迷宫路径

寻找迷宫的解决方案。

def maze_path(x, y, m, n):  
    if x == m or y == n:  
        return []  
    elif x == m - 1 and y == n - 1:  
        return [(x, y)]  
    else:  
        paths1 = maze_path(x + 1, y, m, n)  
        paths2 = maze_path(x, y + 1, m, n)  
        for path in paths1 + paths2:  
            path.insert(0, (x, y))  
        return paths1 + paths2  
  
m, n = 3, 3  
paths = maze_path(0, 0, m, n)  
for path in paths:  
    print(path)  

12. 字符串排列

生成字符串的所有可能排列。

def string_permutations(s):  
    if len(s) == 1:  
        return [s]  
    else:  
        permutations = []  
        for i in range(len(s)):  
            char = s[i]  
            remaining_chars = s[:i] + s[i+1:]  
            for permutation in string_permutations(remaining_chars):  
                permutations.append(char + permutation)  
        return permutations  
  
print(string_permutations('abc'))  

13. 八皇后问题

解决八皇后问题。

def solve_n_queens(n):  
    solutions = []  
    def place_queen(row, cols):  
        if row == n:  
            solutions.append(cols)  
            return  
        for col in range(n):  
            if all(abs(c - col) not in (0, row - i) for i, c in enumerate(cols[:row])):  
                place_queen(row + 1, cols + [col])  
    place_queen(0, [])  
    return solutions  
  
for solution in solve_n_queens(8):  
    print(solution)  

14. 斗地主发牌

模拟斗地主游戏发牌过程。

import random  
  
def deal_cards():  
    cards = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2'] * 4 + ['小王', '大王']  
    random.shuffle(cards)  
    hands = {'player1': [], 'player2': [], 'player3': []}  
    for i in range(17):  
        for player in hands:  
            hands[player].append(cards.pop())  
    return hands  
  
print(deal_cards())  

15. 字符串匹配

检查一个字符串是否包含另一个字符串。

def string_match(s, pattern):  
    if not pattern:  
        return True  
    if not s:  
        return False  
    if s[0] == pattern[0]:  
        return string_match(s[1:], pattern[1:])  
    else:  
        return string_match(s[1:], pattern)  
  
print(string_match("hello", "he"))  # 输出: True

实战案例分析:汉诺塔问题

汉诺塔问题是一个典型的递归案例,涉及到将多个圆盘从一个柱子移动到另一个柱子上,但每次只能移动一个圆盘,且大盘不能放在小盘之上。

def hanoi(n, source, target, auxiliary):  
    if n > 0:  
        # 将n-1个圆盘从source移动到auxiliary  
        hanoi(n - 1, source, auxiliary, target)  
        # 移动最大的圆盘从source到target  
        print(f"Move disk {n} from {source} to {target}")  
        # 将n-1个圆盘从auxiliary移动到target  
        hanoi(n - 1, auxiliary, target, source)  
  
# 示例调用  
hanoi(3, 'A', 'C', 'B')  

这个例子展示了如何通过递归解决复杂问题,同时也体现了递归的分治策略。

使用技巧:

  • 在面对问题时,思考是否可以通过分解为子问题来解决,这是递归的一个良好起点。

  • 在设计递归函数时,始终定义清晰的基线情况和递归情况。

递归是编程中一个强大的概念,但使用得当才能发挥其真正的潜力。希望这篇文章能帮助你更好地掌握和应用递归技术!

关于python技术储备

由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人不骗中国人。
在这里插入图片描述

                                     **(扫码立即免费领取)**

全套Python学习资料分享:

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频全套

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。


在这里插入图片描述

如有侵权,请联系删除。

标签:arr,return,递归,递归函数,Python,print,15,def,row
From: https://blog.csdn.net/qq_56262770/article/details/140891552

相关文章

  • 如何使用 python (使用服务帐户)在应用程序脚本 Web 应用程序上触发 doGet()?
    我想从返回json的应用程序脚本Web应用程序触发doGet(e)事件。我们的网络应用程序无法在我们的组织域之外访问,因此需要服务帐户。我执行了下面的代码,但“发生错误:401客户端错误”fromgoogle.oauth2importservice_accountfromgoogle.auth.transport.requestsimpor......
  • LeetCode面试150——238除自身以外数组的乘积
    题目难度:中等默认优化目标:最小化平均时间复杂度。Python默认为Python3。目录1题目描述2题目解析3算法原理及代码实现3.1左右乘积列表参考文献1题目描述给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积......
  • 如何使用 BeautifulSoup python 查找选择标签的选定选项值
    我正在尝试从python中的htmlselect标签获取选定的值。好吧,当选项属性设置为selected="selected"时,它是成功的,但我试图废弃的网站具有不同的选项属性,例如:-html="""<select><optionvalue="">Pleaseselectavlalue</option><o......
  • 12:Python元组属性
    #元组tuple,元素不可被修改,不能被增加或则删除tu=(111,'alex',(11,22),[(33,44)],True,33,44,)#一般写元组的时候,最后可以加个逗号不报错print(tu)tu=(111,'alex',(11,22),[(33,44)],True,33,44,)v=tu[0]#元组索引print(v)tu=(111,'alex',(11,2......
  • 如何在venv python中安装requirements.txt
    我是Python虚拟环境的初学者,在安装requirements.txt文件时遇到问题。问题是,当我运行命令来安装requirements.txt文件时,没有安装任何内容。平台:WindowsVS代码镜像如何解决这个问题?没有正确激活虚拟环境。请按照以下步骤操作:1.激活虚拟环境:在VSC......
  • 【代码随想录】图论复习(Python版)
    深度优先搜索1.搜索过程一个方向搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)2.代码框架回溯法的代码框架:defbacktracking(参数):if终止条件:存放结果returnfor选择本层集合中的元素(树中节点孩子的数量......
  • MATLAB(15)分类模型
    一、前言    在MATLAB中,实现不同类型的聚类(如K-means聚类、层次聚类、模糊聚类)和分类(如神经网络分类)需要用到不同的函数和工具箱。下面我将为每种方法提供一个基本的示例代码。二、实现1.K-means聚类%假设X是数据矩阵,每行是一个样本,每列是一个特征X=[randn......
  • 【Python】数据类型之字符串
    本篇文章将继续讲解字符串其他功能:1、求字符串长度功能:len(str)  ,该功能是求字符串str的长度。代码演示:2、通过索引获取字符串的字符。功能:str[a]  str为字符串,a为整型。该功能是获取字符串str索引为a处的字符。注意:字符串的索引是从0开始的。代码演示:注意......
  • 【Python】python基础
    本篇文章将讲解以下知识点:(1)循环语句(2)字符串格式化(3)运算符一:循环语句循环语句有两种:while   for本篇文章只讲解while循环格式:while 条件:  代码(只有条件为真的时候,此代码才会被执行,此处的代码可以是多行代码)(1)循环语句基本使用示例1:此处代码执行过程:1<3......
  • K11505 The Lost cow[USACO-2017-USOpen-B]
    题目描述FarmerJohn最珍贵的奶牛Bessie丢了,他需要把它找回来。幸运的是,农场里只有一条长长的直路,他知道Bessie肯定在这条路上的某个地方。如果我们把这条路看成数轴,假设FarmerJohn所在位置是x,Bessie所在的位置是y(对于John是未知的),如果FarmerJohn知道Bessie的位置,那么他就......