递归
在数学归纳法那篇文章里用递归,递归的函数值返回过程与基于循环的迭代看起来似乎一样。那么为什么不用循环来做呢。
数学归纳法:1.证明当n= 1时命题成立; 2.假设n=m时命题成立,那么可以推导出在n=m+1时命题也成立。(m代表任意自然数)。
假如将这俩条儿顺序调换一下,emmm会怎样呢。 1.假设 n= m的时候,问题已解决(已知结果or目的)。只要求解 n=m+1时。 2.n = 1时如何求解
看看一个例子,如何在限定总和的条件下,求出所有可能的加和方式。
(⊙﹏⊙)这里就用了基于递归的另外一种思路。
递归虽好,但是容易堆栈溢出。比如:
Error因为计算机资源有限,函数调用时会使用栈来保存临时变量。每调用一次function,都会将此做为临时变量封装为栈帧压入内存栈,等函数返回时,才出栈。python最多只能 recursion depth =100,所以pthon 不愿做,这已经超出其能力了。
所以如何避免这种情况呢,应该告诉它,到达一定的时候停止,否则返回报错,如开辟临时变量count,记录递归次数,达到一定时候就返回。但是代码更复杂时,如何计算 recursion-depth呢,难道一个个试,所以并不合适。
注意图(⊙﹏⊙)有重复情况,即[1,2],[2,1],从某种程度上看是.如果为了避免重复计算,中途应该保存变量值(r如哈希表),借此判断是否重复计算。
递归尽管易操作,写起来简洁,但是所费的时间复杂度会更大,并且难想到,理解,所以平时使用时应格外注意。
总结:递归把大问题变成小问题,把小问题分解成更小的,易与解决的
使用时:1.考虑栈 虚拟机空间大小 2.是否重复计算 3.设置边界,避免无限计算。