递归就是函数执行后调用自己的方式,为避免一直调用自己,需要设置递归出口。
递归经常和循环绑定在一起,所有的循环都可以转换成递归,递归不可以一定能转换到循环。
数列 1 2 3 4 5 6 7 8... 数列每一项的后一项都是由前一项加一得到。
如果把每一项叫做f(n)的话,即f(2) = 2, f(1) = 1....可以得出f(n) = f(n-1) + 1的数学公式。
这里就形成了递归关系,出现函数调用自己来求解自己的行为,f(n)为了求解出自己必须得到f(n-1)的值,f(n-1)为了求解自己必须得到f(n-2)的值,f(n-2)为了求解自己必须...
可以预见的是,倘若不对此递归式施加条件限制,它需要的前一项始终是函数,它得不出自己前一项的具体数字,它会一直调用自己,一直一直,直到永远...
于是,为了避免这种情况,在递归式的基础上还需要递归出口,就是当函数自己调用到自己到一定层数时可以拿到具体数值,使递归停止,然后从最里层拿到的数据一层一层的返回给上一层,最终返回给最初执行的函数,就是我们希望拿到的。 这个过程有点类似于盗梦空间,我们被要求睡觉并且必须在梦里看到老王裸奔的真正场面,否则永远醒不过来。于是我们在梦里梦到老王裸奔,然受梦里做的梦就醒了,把梦里梦到的老王裸奔的事情告诉梦里,然后梦也醒了,梦醒了就告告诉了现实,于是我就清楚老王裸奔的场面了。换句话讲,我们如果在梦里梦