Python中函数的递归调用

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

下面我们来举个例子:

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是新的递归层数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

主机访问Android模拟器网络服务方法

0x00 背景 因为公司的一个手机app的开发需求,要尝试链接手机开启的web服务。于是在Android Studio的Android模拟器上尝试连接,发现谷歌给模拟器做了网络限制,不能直接连接。当然这个限制似乎从很久以前就存在了。一直没有注意到。 0x01 And…

分销电商结算设计

概述 分销电商中涉及支付与结算;支付职责是收钱,结算则是出钱给各利益方; 结算核心围绕业务模式涉及哪些费用,以及这些费用什么时候通过什么出资渠道,由谁给到收方利益方; 结算要素组成费用项结算周期出…

区块链的可拓展性研究【03】扩容整理

为什么扩容:在layer1上,交易速度慢,燃料价格高 扩容的目的:在保证去中心化和安全性的前提下,提升交易速度,更快确定交易,提升交易吞吐量(提升每秒交易量) 目前方案有&…

详解进程管理(银行家算法、死锁详解)

处理机是计算机系统的核心资源。操作系统的功能之一就是处理机管理。随着计算机的迅速发展,处理机管理显得更为重要,这主要由于计算机的速度越来越快,处理机的充分利用有利于系统效率的大大提高;处理机管理是整个操作系统的重心所…

前后端联调神器《OpenAPI-Codegen》

在后端开发完接口之后,前端如果再去写一遍接口来联调的话,会很浪费时间,这个时候使用OpenAPI接口文档来生成Axios接口代码的话,会大大提高我们的开发效率。 Axios引入 Axios是一个基于Promise的HTTP客户端,用于浏览器…

Go压测工具

前言 在做Go的性能分析调研的时候也使用到了一些压测方面的工具,go本身也给我们提供了BenchMark性能测试用例,可以很好的去测试我们的单个程序性能,比如测试某个函数,另外还有第三方包go-wrk也可以帮助我们做http接口的性能压测&…

C# 任务并行类库Parallel调用示例

写在前面 Task Parallel Library 是微软.NET框架基础类库(BCL)中的一个,主要目的是为了简化并行编程,可以实现在不同的处理器上并行处理不同任务,以提升运行效率。Parallel常用的方法有For/ForEach/Invoke三个静态方法…

Element-UI定制化Tree 树形控件

1.复制 说明&#xff1a;复制Tree树形控件。 <script> export default {data() {return {data: [{label: 一级 1,children: [{label: 二级 1-1,children: [{label: 三级 1-1-1}]}]}, {label: 一级 2,children: [{label: 二级 2-1,children: [{label: 三级 2-1-1}]}, {l…

Linux:进程优先级与命令行参数

目录 1.进程优先级 1.1 基本概念 1.2 查看系统进程 1.3 修改进程优先级的命令 2.进程间切换 2.1 相关概念 2.2 Linux2.6内核进程调度队列&#xff08;了解即可&#xff09; 3.命令行参数 1.进程优先级 1.1 基本概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优…

【C++】在类外部定义成员函数时,不应该再次指定默认参数值

2023年12月10日&#xff0c;周日下午 错误的代码 #include<iostream>class A { public:void fun(int a10); };void A::fun(int a10) //<----在这里报错 {}int main() {} 正确的代码 代码目前有一个问题&#xff0c;主要是在类外部定义成员函数时&#xff0c;不应该…

解密QQ号——C语言

题目&#xff1a; 有一串已加密的数字“6 3 1 7 5 8 9 2 4”解密规则&#xff1a;首先将第1个数字删除&#xff0c;紧接着将第2个数字放到这串数字的末尾&#xff0c;再将第3个数字删除并将第4个数字放到这串数字的末尾&#xff0c;再将第5个数删除 代码实现&#xff1a; #inc…

利用Node.js和cpolar实现远程访问,无需公网IP和路由器设置的完美解决方案

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

ESP32网络编程-OTA方式升级固件(基于Web浏览器)

OTA方式升级固件(基于Web浏览器) 文章目录 OTA方式升级固件(基于Web浏览器)1、ESP32的OTA介绍2、OTA升级固件方式3、软件准备4、硬件准备5、代码实现6、一种优雅方式实现Web方式OTA升级6.1 基础OTA代码6.2 新固件库代码在前面的文章中,我们在Arduino IDE的网络端口中,实现…

LeetCode 77.组合

题目&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 方法&#xff1a;灵神-组合型回溯 剪枝 class Solution {private int k;private final List<Integer> path new ArrayList<>();…

反序列化 [网鼎杯 2020 朱雀组]phpweb 1

打开题目 我们发现这个页面一直在不断的刷新 我们bp抓包一下看看 我们发现index.php用post方式传了两个参数上去&#xff0c;func和p 我们需要猜测func和p两个参数之间的关系&#xff0c;可以用php函数MD5测一下看看 我们在响应处得到了一串密文&#xff0c;md5解密一下看看 发…

Windows11安装使用Oracle21C详细步骤<图文保姆级>新版本

Windows11安装使用Oracle21C详细步骤<图文保姆级>新版本 Database Software Downloads | Oracle 中国 下载完成后解压缩 双击setup.exe 打开安装页面 同意下一步 更改自己的路径点击下一步 输入密码 下一步安装等待即可 等待加载配置时间有点久 完成即可 使用 搜索…

【Kubernetes】四层代理Service

Service四层代理 一、Service概念原理1.1、为什么要有Service1.2、Service概述1.3、工作原理1.4、三类IP地址【1】Node Network&#xff08;节点网络&#xff09;【2】Pod network&#xff08;pod 网络&#xff09;【3】Cluster Network&#xff08;服务网络&#xff09; 二、S…

C++之异常处理

C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 1. 终止程序, 如assert. 缺陷: 用户难以接受, 如发生内存错误, 除0错误时就会终止程序. 如果assert括号里面的表达式结果为假, 那么assert就会中断程序并报错, 所以使用assert可以帮助我们在程序判断一些可能出错的…

翻转二叉树(图解、前序遍历、递归与非递归)

LCR 144. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一棵二叉树的根节点 root&#xff0c;请左右翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [5,7,9,8,3,2,4] 输出&#xff1a;[5,9,7,4,2,3,8] 提示&#xff1a; …

【11】Qt Designer

目录 VSCode添加外部工具 QtDesigner PyUIC PyRCC 加载UI文件模板代码 QMainWindow QWidget 常用知识点 1. 修改标题图标 2. 图片资源管理 3. 图片按钮 4. 加载对话框 5. 动态加载Widget 6. 修改主题 其他注意事项 事件被多次触发 PyQt5提供了一个可视化图形工…