Python中函数的递归调用

news/2024/2/22 18:13:16

        函数调用自己的编程方式被称为函数的递归调用递归通常能够将一个大型的复杂问题的递归条件,一层一层的回溯到终止条件,然后再根据终止条件的运算结果,一层一层的递进运算到满足全部的递归条件。它能够使用少量程序描述出解题过程中的重复运算部分,减少程序的代码量。要使用递归的方式进行编程,需要在编程的时候规划好终止条件,写好递归条件,用回溯的逻辑方法解决问题。

下面我们来举个例子:

1.使用递归函数,求斐波那契数列的前10个数

def fib(n):if n==1 or n==0:return 1else:return fib(n-2)+fib(n-1)for n in range(10):print(fib(n),end='\t')

说明:斐波那契数列是一个常用的数学数列,第n个斐波那契数fib(n)由以下两个条件决定:

1 n = 0n = 1时:

  fib(0) = 1fib(1) = 1

 (2) n > 1时:

  fib(n) = fib(n-1) + fib(n-2)

【代码分析】

(1) 第1行,在定义一个名为fib的函数,传递给这个函数的参数为n。

(2) 由题设,斐波那契数列中,n == 0或n == 1时,fib(0) 与fib(1) 都等于 1,我们把这个叫做终止条件。

(3) 第2、3行,在程序中实现终止条件。终止条件,一般都会给定一个或多个数值,或实现某些特定操作。

(4) 由题设,斐波那契数列中,从第三个数开始,第n个斐波那契数的数值,是由公式fib(n) = fib(n-1) + fib(n-2)计算得到,我们称这个是递归条件。

(5) 第5行,在程序中实现了递归条件。

(6) 第7、8行,使用循环,传递0到9,共10个数字进fib函数

(7) 当n == 0 和n == 1时,fib的返回值都为1。

(8) 当n == 2时,第3行不会运行,会运行第5行。第5行中,会调用fib(0)和fib(1),会执行:fib(2) = fib(0) + fib(1)。

(9) 当n == 3时,第2行、第3行不会运行,会运行第5行。第5行中,会调用fib(1)和fib(2),会执行:fib(3) = fib(1) + fib(2)。但是fib(2)此时会重复(7)中所描述的动作,所以此时fib(3) = fib(1) + fib(2) = fib(1) + (fib(0) + fib(1))。

(10) 当n == 4时,第2行、第3行不会运行,会运行第5行。第5行中,会调用fib(2)和fib(3),会执行:fib(4) = fib(2) + fib(3)。但是fib(2)此时会重复(7)中所描述的动作,fib(3)会重复(8)中所描述过程,所以此时fib(4) = fib(2) + fib(3) = (fib(0) + fib(1)) + (fib(1) + fib(2)) =  (fib(0) + fib(1)) + (fib(1) + (fib(0) + fib(1)))。

        每次n无法满足终止条件时,fib(n)都会回溯到fib(n-1)和fib(n-2),只有当n满足了终止条件(n == 0和n == 1)时,fib(n)才会返回一个确定值,然后根据这个确定的值开始计算。简单的说,递归函数,会执行上述过程……、(10)、(9)、(8),直到(7)。

注意:

        当递归层数超过了系统允许的最大递归深度。默认情况下,当递归调用到1000层,Python解释器将终止程序。递归深度是为了防止无限递归错误而设计的,当用户编写的正确递归程序需要超过1000层时,可以通过如下代码设定:

    import syssys.setrecursionlimit(2000)  #2000是新的递归层数


https://dhexx.cn/news/show-5177739.html

相关文章

visual studio code 好用的插件

vscode-icons Better comments 该插件对不同类型的注释会附加了不同的颜色,更加方便区分,帮助我们在代码中创建更人性化的注释。 Error Lens Error Lens插件是一款可以检测你编写的代码的语法错误,并且会显示出对语法错误的诊断信息…

最简单的基于 FFmpeg 的音频解码器

最简单的基于 FFmpeg 的音频解码器 最简单的基于 FFmpeg 的音频解码器正文参考工程文件下载 参考雷霄骅博士的文章,链接:最简单的基于FFMPEGSDL的音频播放器:拆分-解码器和播放器 最简单的基于 FFmpeg 的音频解码器 正文 FFmpeg 音频解码器…

记一次金额操作精度丢失问题与解决

Hi, I’m Shendi 记一次金额操作精度丢失问题与解决 前言 在之前做过几个涉及到金额的项目,因我最开始接触的支付是微信支付,对于微信的设计,是以分为单位,金额为整数形式。知晓精度丢失的问题,我也照着这样&#xff…

Leetcode—231.2的幂【简单】

2023每日刷题&#xff08;五十四&#xff09; Leetcode—231.2的幂 实现代码 class Solution { public:bool isPowerOfTwo(int n) {if(n < 0) {return false;}long long ans 1;while(ans < n) {ans * 2;}if(ans n) {return true;}return false;} };运行结果 之后我会…

【面试经典150 | 二叉树】从中序与后序遍历序列构造二叉树

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;递归 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容…

国内大厂机器人赛道产品

大疆 大疆无人机自然不必说&#xff0c;除此之外大疆搞机甲大师&#xff0c;教育机器人。 字节 当前字节在机器人领域只是初步探索阶段&#xff0c;目前尚未发布相关产品&#xff08;截止至23.12&#xff09;。 管理层想法&#xff1a; 跟已有业务做结合&#xff0c;服务好…

rpc原理与应用

IPC和RPC&#xff1f; RPC 而RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;又叫做远程过程调用。它本身并不是一个具体的协议&#xff0c;而是一种调用方式。 gRPC 是 Google 最近公布的开源软件&#xff0c;基于最新的 HTTP2.0 协议&#xff0c;并支持常见…

【解密考研英语:Python数据分析与可视化】

解密考研英语&#xff1a;Python数据分析与可视化 背景数据集技术选型功能实现创新点 大家好&#xff0c;欢迎阅读我的CSDN博客&#xff01;今天我将分享一项有关考研英语真题的数据分析与可视化项目&#xff0c;希望对考研学子提供更有针对性的复习帮助。 背景 作为考研学子…

元素定位,年轻人在 Web UI 自动化成长道路上吃的第一个亏

01/Katalon Studio 的 Web spy spy 英文翻译过来的意思是&#xff1a;间谍、密探。是具有监视意识的。 所以我们可以使用这个功能去监视 Web 元素并定位出来。具体操作如下&#xff1a;1&#xff0c;打开 Katalon 并创建好项目工程 2&#xff0c;在快捷键栏里点击 Web spy 如…

Java面试遇到的一些常见题

目录 1. Java语言有几种基本类型&#xff0c;分别是什么&#xff1f; 整数类型&#xff08;Integer Types&#xff09;&#xff1a; 浮点类型&#xff08;Floating-Point Types&#xff09;&#xff1a; 字符类型&#xff08;Character Type&#xff09;&#xff1a; 布尔类…