递归的一些问题实现及尾递归思考
Part 1 什么是递归: 我们知道循环(iteration)和递归(recursion)可以理解为孪生兄弟,递归是函数抽象表达的一种。递归的优点显而易见,它在某些条件下,比循环代码量更少。递归简单来说,就是在运行过程中调用自己。而递归的实现需要满足两个条件,存在限制条件,在函数体同时在递归过程中不断逼近限制条件。(此阶段暂不考虑栈溢出) Part 2 一些递归的问题(任何理论逃不开实例): (1)汉诺塔问题: 首先我们要知道什么是汉诺塔问题: 这源于一个印度的传说,作者为避免文字误会,直接引用:“大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。” 简言之,现在有3个柱子,其中A柱有n个铁片从上至下为从小至大的顺序,B,C柱为空柱,需要利用B柱,将A柱上贴片转移到C柱,但是在过程中满足,大铁片不能出现在小铁片之上。 首先我们将n设置为3,观察移动过程: 借用知乎博主酱紫君gif 假设n=3的过程我们已经知道,此时我们来思考n=4时的过程 首先,我们将A上的前3个贴片移到B柱子上,则会出现下面的情景(过程一): 再将A上的最后一个贴片移到C柱上(过程2) 此时我们只需要将B柱子上的的三个贴片重复n