首页 > 编程语言 >Python常用算法思想--递归算法思想详解【附源码】

Python常用算法思想--递归算法思想详解【附源码】

时间:2024-04-04 17:00:33浏览次数:28  
标签:圆盘 递归 Python 问题 factorial 算法 源码 汉诺塔 阶乘

递归算法能够重复性的将问题分解为同类的子问题,然后解决这些子问题,最终达到解决最开始的问题为目的。以下从解决“阶乘”问题、“汉诺塔”问题、“斐波那契数列”问题、“最大公倍数和最小公约数”问题、“小球弹跳”、“深度优先”与“广度优先”问题等六个经典递归算法的案例进行介绍:

一、解决“阶乘”问题

阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是一个正整数的阶乘(factorial)是所有小于及等于正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。

亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

N的阶乘就是N*fact(N-1),具体代码如下:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

# 测试
num = 5
print(f"{num}的阶乘是:{factorial(num)}")

二、解决“汉诺塔”问题

汉诺塔来之一个印度古老传说,大体意思是:寺庙有三根柱子,在一根柱子上从下往上按照大小顺序摞着64片圆盘,现状需要把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

hanoi 函数使用递归的方式解决汉诺塔问题。它接受四个参数:n

标签:圆盘,递归,Python,问题,factorial,算法,源码,汉诺塔,阶乘
From: https://blog.csdn.net/helloshili2011/article/details/137373328

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (229)-- 算法导论16.5 2题
    二、说明如何利用引理16.12的性质2在O(|A|)时间内确定一个给定任务集合A是独立的。文心一言:引理16.12的性质2可能是指某个特定引理中关于任务集合独立性的一个性质。由于具体的引理内容没有给出,我将基于任务集合独立性的通用概念来提供一个一般性的解释。任......
  • 使用 Python 和 TensorFlow 构建深度人脸检测模型
    在本教程中,我们将逐步介绍使用Python和TensorFlow构建用于人脸检测的深度学习模型的过程。人脸检测是许多计算机视觉应用的重要组成部分,包括人脸识别、监控和图像理解。我们将利用卷积神经网络(CNN)和VGG16架构的强大功能来完成此任务。1.设置和数据收集1.1安装......
  • 使用 Python 构建第一个 CNN 机器学习模型的完整指南
    在这篇博文中,我们将逐步介绍如何使用Python构建第一个卷积神经网络(CNN)机器学习模型。由于CNN能够捕获数据中的空间层次结构,因此被广泛用于图像识别和分类任务。第1步:导入必要的库首先,让我们导入构建CNN模型所需的库:importnumpyasnpimportmatplotlib.pyplo......
  • 算法绘本-选择排序
    选择排序也是一种比较简单的排序方式,其原理是在给定的一系列值中,首先找出最小的值放在第一位,然后在剩下的值中找出最小的值放在第二位,以此类推,直到剩下的值只有一个的时候,则完成了排序。下面看一个例子,假设给定一组数字3,2,8,2,4,9,1首先是第一轮,假设第一个数字3为最小值,记录下......
  • java计算机毕业设计(附源码)音乐播放平台(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着数字时代的到来,音乐播放平台已经成为了人们生活中不可或缺的一部分。这些平台通过互联网提供了大量的音乐资源,使得用户可以随时随地欣赏到自己喜欢的......
  • java计算机毕业设计(附源码)音乐播放器app(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今的数字化时代,音乐已经成为人们日常生活中不可或缺的一部分。随着智能手机和移动互联网的普及,音乐播放器app应运而生,为人们提供了随时随地欣赏音乐......
  • python中*args和**kwargs的理解
    python中*args和**kwargs的理解在Python中,*args和**kwargs是两种用于函数定义的参数,它们允许函数接受不定数量的参数。这种特性在需要创建灵活的函数时非常有用,尤其是在事先不知道将要传递多少参数的情况下。1.*args(非关键字参数):*args用于函数定义中,它允许函数接......
  • 如何系统地学习Python(六)实践项目
    一、Web开发1、Flask框架使用Flask框架可以轻松构建简单的Web应用。下面是一个简单的示例,展示了如何使用Flask创建一个包含一个路由的Web应用。首先,确保已经安装了Flask框架:pipinstallflask接下来,创建一个Python脚本(例如app.py),并导入Flask模块:fromflaskimportFlask......
  • Swoole 源码分析之 Channel 通道模块
    原文首发链接:Swoole源码分析之Channel通道模块大家好,我是码农先森。引言通道,用于协程间通讯,支持多生产者协程和多消费者协程。底层自动实现了协程的切换和调度。通道与PHP的Array类似,仅占用内存,没有其他额外的资源申请,所有操作均为内存操作,无IO消耗。底层使用PHP......
  • 算法 哈希表 day03
    哈希表当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。牺牲了空间换取了时间当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。数组set(集合)map(映射)第一题:242.有效的字母异位词-力扣(LeetCode)//暴力publicstaticboo......