1691_python学习笔记之week3_递归

news2024/11/14 19:38:43

全部学习汇总: GreyZhang/python_basic: My learning notes about python. (github.com)

最初接触递归的时候觉得这个有点不好理解,怎么能够有这种思维方式?这完全不同于之前自己所能够了解的那种一加一等于二的方式。相对于能够看得见的那种直观的理论,这些确实是一种逻辑型的、推理式的描述理论。

递推比较适合解决的问题通常有两个特点:第一,需要解决的复杂问题可以分解或者简化为更小或者更简单的小问题;第二,最小或者最简单的问题能够得出确切的答案。

从之前实现的一个问题来入手说明一下,如果想要求解a*b,在之前的循环中采用的解决方式如下:

a * b = a + a +......+a(b个a)。

如果把上面的公式变化一下,改成:

a *b = a + a + …… + a(b-1个a) + a

以上的描述依然成立,但是右边部分可以理解为a * (b - 1) + a

假设有一个函数f(x) = ax来描述上面的表达,那么a *b 可以理解为f(b)的函数值。而第二个表达式则可以理解为f(b-1) + a的值。而对于f(x)来说,f(x) = f(x-1) + a也是成立的。对于这种描述成立的证明,通常可以使用数学归纳法来证明。证明的过程一般是先验证最初的几个比较小的数值,再假设x = k的时候成立,推导出x = k + 1的时候依然成立。

既然有了上面f(x) = f(x-1) + a的推导关系,而x=1的时候结果我们显然知道。那么求解相应计算的函数可以设计如下:

执行结果如下:

>>> ================================ RESTART ================================

>>>

>>> F(3,5)

15

>>> F(123,456)

56088

通过以上的演示可以看出,在一定范围内的问题处理分析使用递归的思想是可以化繁为简、化腐朽为神奇的。

在程序设计上,个人感觉循环和递归之间很多时候都是可以相互转化的。倒不是说这两种方式等同,只是说能够解决同样的问题。但是在编程实践中发现,递归的方式通常会消耗大量的内存。一般的代码中,递归的嵌套层级也是有限制的。当嵌套的数目过多,程序无法执行。单纯的循环这方面的限制则会少很多。不过,很多时候,递归的方式确实是能够写出更加简洁的代码。如果运算的层级不深,倒是一种不错的选择方式。

常见的递归算法示例莫过于那几个,最常见的便是汉诺塔以及斐波那契函数。下面也写几个简单的递归函数,加深一下印象。

示例1:求阶乘

代码设计如下:

执行结果如下:

>>> ================================ RESTART ================================

>>>

>>> Fun(1)

1

>>> Fun(5)

120

>>> Fun(20)

2432902008176640000L

通过测试,执行结果正确。

示例2:汉诺塔

设计代码如下:

运行测试结果如下:

>>> ================================ RESTART ================================

>>>

>>> Towers(1,'A','B','C')

move from A to B

>>> Towers(2,'A','B','C')

move from A to C

move from A to B

move from C to A

>>> Towers(5,'A','B','C')

move from A to B

move from A to C

move from B to A

move from A to B

move from C to B

move from C to A

move from B to C

move from A to C

move from B to A

move from B to C

move from A to B

move from B to A

move from C to A

move from C to B

move from A to C

move from A to B

move from C to B

move from C to A

move from B to C

move from C to B

move from A to B

move from A to C

move from B to A

move from C to A

move from B to C

move from B to A

move from C to B

move from B to C

move from A to C

move from A to B

move from C to A

示例3:斐波那契数列

设计代码如下:

运行结果如下:

>>> ================================ RESTART ================================

>>>

>>> Fibnacci(1)

1

>>> Fibnacci(0)

1

>>> Fibnacci(13)

377

>>> Fibnacci(25)

121393

这里特意尝试试了一个比较多层的运算,运算报错,在一大堆的提示后面有一个错误的描述:

RuntimeError: maximum recursion depth exceeded

递归或者迭代的层级超限。这就是前面说到的缺点了。其实,除了这个缺点以外,还有一个比较大的缺点便是执行速度。通常递归的运算在层级比较深的时候慢到足以用需要人来久久等待,通过一个简单的循环计算阶乘的算法比较一下就能够很明显感觉出这种差异。不过,递归确实是一种很好的计算机思维,就像前面所说,很多时候它能够化繁为简。用到合适的地方,这确实是一个简单而有效的方式。

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

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

相关文章

企业采购都在用什么系统管理采购流程?ERP够用了吗?

ERP(企业资源计划)和采购管理系统都是企业信息化系统的一部分,它们在企业中扮演着不同的角色。下面是它们之间的区别:区别 功能不同:ERP系统是一个综合性的企业管理系统,覆盖范围广,包括财务、人…

Android12 material you 动态配色

动态配色功能是 Material You 设计的核心 一、完整的动态配色流程包括四个步骤,如下所示: 用户通过 OEM 选择器更改壁纸或主题。AOSP 逻辑会自动从所选壁纸中提取单一源颜色。将源颜色扩展到颜色API,AOSP 将单一源颜色扩展为 5 ,…

JS实现拼音(字母)匹配(搜索)汉字(姓名)

这就是个模糊查询,我们平常做的都是直接输入汉字去把对应的值过滤出来,但我还真是第一次通过拼音去查询(当然不只是拼音,汉字也是可以的),以前还真没注意这个。唉,这可咋搞,我怎么知…

python:面向对象编程(知识点+代码)

文章目录 一、类和对象1、对象属性的默认值设置2、对象属性的添加、修改与删除3 、类属性 二、类的继承 引言:面向对象编程时一门编程语言重要的功能,我们之前所学的 c,java都为面向对象编程语言,这里给大家拓展一下,…

getaddrinfo调用crash 的debug过程

前两天,产线报一例crash问题。拿到core文件后,栈展开信息: (gdb) bt #0 0x00007f64a3651aff in raise () from /lib64/libc.so.6 #1 0x00007f64a3624ea5 in abort () from /lib64/libc.so.6 #2 0x00007f64a3694097 in __libc_message () …

【论文阅读-ICSE2023】预训练目标对代码相关任务的影响

目录 简介有哪些预训练预训练的影响回答RQ1回答RQ2 总结 简介 Title: Automating Code-Related Tasks Through Transformers: The Impact of Pre-training1 Author: Rosalia Tufano, Luca Pascarella, Gabriele Bavota Published: ICSE2023 Abstract: 尽管现在很多研究能够证…

OSS的STS模式授权案例

OSS的STS模式授权 某云提供的权限管理系统主要包含两部分,RAM(资源访问管理)和STS(安全认证服务),以满足不暴露主账号AK\SK的情况下安全的授权别人访问的需求,STS提供的是一种临时访问授权。通…

XSS知识总结

XSS基础 跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这…

楼层滚动效果(超级简单,易懂)

系列文章目录 文章目录 系列文章目录一、楼层滚动效果图如下1. 下图是纯Css实现的楼层滚动2.通过Js优化后的楼层滚动如下图(🌹🌹) 二、楼层滚动(Css实现)1.滚动原理2.代码如下 三、楼层滚动(JsCss优化后的楼层滚动&…

FreeRTOS学习笔记(二)——内核机制

文章目录 0x01 临界段Cortex-M内核快速关中断指令关中断开中断进入和退出临界段的宏进入临界段退出临界段临界段代码应用 0x02 空闲任务与阻塞延时的实现空闲任务的创建实现阻塞延时阻塞等待总结 0x03 多优先级通用方法:taskRECORD_READY_PRIORITY()taskSELECT_HIGH…

微服务学习——服务异步通讯

实用篇-RabbitMQ 初识MQ 同步调用的问题 微服务间基于Feign的调用就属于同步方式,存在一些问题。 耦合度高 每次加入新的需求,都要修改原来的代码性能下降 调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和…

【数据库】事务的隔离级别以及实现原理

文章目录 前言一、事务什么是事务?事务的四大特性分别是 二、事务并发存在的问题脏读可重复读不可重复读幻读 三、以MYSQL数据库来分析四种隔离级别第一种隔离级别:Read uncommitted(读未提交)第二种隔离级别:Read committed(读提交)第三种隔…

此环境变量太大,此对话框允许将值设置为最长 2047 个字符

背景: 自己是一个计算机爱好者,又大体精通计算机各种编程语言,所以电脑上安装的各种编译或者编程软件比较多,有一天需要安装一个多版本的python环境,发现无法添加环境变量,于是乎,自己去查看原因并解决这个…

C语言 sizeof, size_t, strlen

C语言 sizeof, size_t, strlen 文章目录 C语言 sizeof, size_t, strlen一. sizeof1.1 返回结构体长度 二. size_t三. sizeof 和 strlen 一. sizeof 返回一个结构体或者类型所占的内存字节数 1.1 返回结构体长度 这里我编写了2个结构体,区别在于数组问题 #include …

智慧园区gis三维数字孪生可视化平台辅助管理者提升安全管控效力

随着信息技术的发展,3D可视化已经成为交互式管理的主流。智慧3D可视化交互管理平台能够帮助企业实现高效、灵活的管理。 1:智慧3D可视化交互管理平台的基本特性 智慧3D可视化交互管理平台能够实时显示工厂中生产车间的设备和生产线的运行状态,并通过交互…

火焰图怎么看

性能平台 通过该平台可以使用pprof采集线上的服务指标数据生成CPU占用数据并自动绘制出火焰图,Top,以及函数调用图等。 1.1 火焰图 火焰图的深度代表了函数的调用栈,火焰图最深处就是正在执行的函数,上方的都是它的父函数&#x…

C++线程的简单学习及了解

此篇文章只是线程的简单了解。 文章目录 前言一、线程的优缺点二、C线程库 1.thread类的简单介绍2.线程函数参数总结 前言 什么是线程? 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控…

git 使用大全及各种疑难杂症解决方法(长期更新)

Git使用中遇到的各种问题及解决方法 git clone后修改文件然后再上传覆盖 git push出现“Everything up-to-date”解决方法 git commit后如何撤销或修改 git 同步远程和本地的同名分支 git push异常问题出现符号解决方法 git 删除最近或者任意一次提交commit

Http详解

一、什么是Http协议 Http全称为超文本传输协议,是目前使用最主流的 应用层协议, 二、Http工作过程 当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送⼀个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回⼀个 …

DAY06_常用API上

1:API 概述 1.1 API概述 如何自己设计对象并使用 获取已有对象并使用 而关于第一块知识:学习如何自己设计对象并使用,现在已经有一些基础了。 API(Application Programming Interface) :应用程序编程接口 那如何理解应用程序…