python递归实际应用_轻松搞懂Python递归函数的原理与应用

递归: 在函数的界说中,函数内部的语句挪用函数自己。

1、递归的原理

学习任何盘算机语言历程中,“递归”一直是所有人心中的疼。不知你是否听过这个冷笑话:“一个面包,走着走着饿了,于是就把自己吃了”。

呵呵。

FvMjIf.png

常理推断,特别是注释型语言,当程序执行函数内部的语句时,这个函数还没有界说完,没界说完怎么可以挪用自己呢。

但实质上,当你执行函数内部的语句时,一定有函数外部的语句挪用了这个函数,此时该函数的所有代码和语句,已经在内存中形成了逻辑,这就是递归函数的原理。

在Python当中很主要的就是递归的使用。

2、递归的玩法

牛叔语录:人类创造出的任何庞大的观点,都是为了让事情变得更简朴一些。

递归是为了更好的解决,“自已界说自己”的数学或是哲学难题。

用好递归,有2个、2个、2个(主要的事情说3遍)要点,必须要同时注重,下面请列位评委看我的演出。

(1) 认清自己

认清自己是递归玩法的焦点。与处置任何事情一样,首先要问的就是:若何准确地界说好“当前要做的事情”。处置好这个问题,我们就已经乐成了一半。

此处我们拿数学函数为例, 由于数学函数的界说有公式,显而易见,它的意义就是凭据变量来盘算出效果,最容易被小白明了,栗子如下:

假设数学函数:

f(n) = (f(n-1) + 1)*2 ,告诉你f(1)=1,问f(10)是若干?

我们直接把这个f(n)界说成函数,而且盘算f(10) 如下:

deff(n):if n==1:return 1

else:return (f(n-1)+1)*2

print(f(10))

效果是1534,运行准确。恭喜你这是一道著名的数学难题,你竟然轻松解决了,原题这样:

猴子有一堆桃子,天天吃前一天剩下的一半多1个,昨天吃完发现剩了1个,那么前10天它剩下若干个桃子?

我们公式中的n就示意前n天,公式效果就示意剩下了若干桃子,昨天的桃子y总比今天的x有这样的关系:x = y/2 -1 以是:y=(x+1)*2,这个就是上面的公式。

在写本递归函数时,语句基本上照抄数学公式,我们不知道解题历程就能求出谜底,真是太神奇了!只要界说好,递归跑不了!慢着,别下结论,我们再看看如下的点。

(2)掌握好偏向

与上面的“猴子摘桃”同一个问题,原题我们改一下说法,问:

猴子第1天摘了一堆桃子吃了一半又多一个,第2天吃了剩下的一半又多一个,…,第10天早上时发现只有1个桃子了。问第1天摘了若干?这回我们把n设为第n天(而不是前n天)

与上面函数f类似,后项也是凭据前项值来确定,为区别我们使用g()代表该函数:

g(n) = g(n-1)/2 -1 ,告诉你 g(10)=1,问g(1) 是若干?

牛叔说了,“只要界说好,递归跑不了”,我们先不管三七二十一,照抄上面的数学公式,“迅速而又准确”地把g(n)函数用如下的代码造了出来,如下:

defg(n):if n==10:return 1

else:return g(n-1)/2 - 1

print(g(1))

运行后却泛起了如下的错误,提醒递归溢出!

Mb2ai2.png

这是怎么回事呢?由于我们另有第2个点,您没有注重!

这个点就是 “要想递归不失足,开车偏向不能错”,这个偏向是指: 程序求解的偏向必须和界说的偏向相同,

此处我们要凭据n=10的效果来求n=1,偏向是:后项(10)->前项(1),而程序中翻译的公式是 前项(n-1)->后项(n),凭据公式写的程序,也只能完成公式的求解顺序,即:n从小到大的推导,

以是此时若是求g(100),效果是这样的,完全没有问题(但没有任何意义):

-2.0

以是此处要通过我们的智慧把这个公式,“颠倒”过来酿成:

g(n-1) = (g(n)+1) * 2 => g(n) = (g(n+1)+1) * 2

这样凭据公式写的代码,就可以完成从后项(n+1)推导到前项(n)的功效了!

若是不明了,小学二年级的代数再看一遍,详细程序如下:

1 defg(n):2 if n==10:3 return 1

4 else:5 return 2*(g(n+1)+1)6

7 print(g(1))

终于得出了准确的效果,1534。谜底和第1题一样!猴子终于满足了,10天的口粮有着落了。

3、剖析质因数演习

小学生专用名词,别给吓住了,实在就是把数字剖析成不能再剖析的乘法,好比:8=2*2*2, 10 = 2*5,而不是 8 = 2 * 4 这种可以再剖析的。

此递归问题,是编程竞赛常客,拿来练手对照合适。如下Python代码,对于本问题的解答充分说明了递归的利便之处,以剖析了980这个整数为示例:

1 def defactor(N): #界说一个函数名称为defactor,意义是返回N的所有因子

2 for i in range(2,N): #从2最先试试

3 if N%i ==0: #若是试到i是N的因子的话,就返回i的所有因子和N/i的所有因子 的列表

4 return defactor(i)+defactor(int(N/i))5 else:#若是没有试到就说明这个N是一个质数,就直接包罗它的 列表

6 return[N]7

8 print(defactor(980))

运行的谜底是:

[2, 2, 5, 7, 7]

Bingo,在这里函数defactor(N)

(1)界说: 求出参数N所有因子的数组,

(2)偏向:整数 -> 最小的质数

首先,明了else:部门(代码中的第5,6两行),

这是函数的,把偏向的部门,小牛叔称他为:效果发生部门,它能确保程序不会跑偏的代码,若是传入的数字N没有可以被整除的数字,即循环到头了,才会执行这个部门,每一个质数因子都市从这个部门发生,由于最终的效果只能是质数。下图树中的所有叶节点(没有子节点的叶子:2,2,5,7,7),就是从这个部门发生的,当执行到这个部门时,程序不会再往向下递归,以是不会发生下层的树型结构。

再明了,递归的部门(2,3,4行)

通过循环来试因子,若是试到i是N的因子(即N可以被i整除)的话,就返回i的所有因子和 N/i的所有因子 组成的列表,因此下图中所有从上到下的两个箭头对,就代表着这两个递归挪用。

通过这个树形解题的历程,您会加倍明了!

NZNFnu.png

在整个程序递归执行时,看起来是从顶980最先向下求解执行,而求解的历程中效果却是从最下层的7,7最先向上搜集。

原文链接:https://www.cnblogs.com/dosboy/p/python_l1.html

本站声明:网站内容来源于网络,若有侵权,请联系我们,我们将及时处置。

JMeter之If Controller深究一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值