关于递归函数执行流程的一些分析与记录,示例代码用Golang编写

前言:不少人可能和我一样,刚开始接触递归的时候理解起来都会有些懵

下面我会用两个例子加上一些步骤的流程图讲解一下,算是自己学习的一些记录

例子1(普通递归):

下面的递归只是一个非常简单的例子,类似for循环的功能,就是当传入的数一直自减到小于等于0时,终止递归

这是个很重要的点,如果没有终止条件,递归会一直无线循环下去,所以写递归一定要记得写终止条件

func recursive(n int) int {
    if n <= 0 {
        return n
    }
    n--
    return recursive(n)
}

这种很容易理解,直接当成for循环就好!

倒是下面的例子稍微复制一些 

例子2(斐波那契数列):

斐波那契数列的前几个数字是这样的:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233…

我们可以通过这些数字的排列规律总结出对应的计算公式:

F(1) = 0

F(2) = 1

F(n) = F(n-1) + F(n-2)

即从第三个数字开始,对应的数值是前面两个数字的和

其中 n 表示数字在斐波那契数列中的序号,最后一个公式就是递归模型

通过这个公式就可以把求解斐波那契数列的问题拆分为多个子问题来处理:即把求解 F(n) 的值拆分为求解 F(n-1) 和 F(n-2) 两个子问题返回值的和,依次类推,直到到达终止条件:当 n=2 时,返回数值 1,当 n=1 时,返回数值 0

显然这是一个递归处理的过程,我们根据这个思路编写对应的递归函数 fibonacci 实现如下:

func fibonacci(n int) int {
    if n == 1 {
        return 0
    }
    if n == 2 {
        return 1
    }
    return fibonacci(n-1) + fibonacci(n-2)
}

同样是当n=5,即求斐波那契数列第五个数,下面是每次n值的分解图:

rO8ZbEZtO6Ueh8oUT9CrZqbdypxcabFsuq99Xolr.png

执行步骤:

  1. (5 -> 4 -> 3 -> 2)=>1
  2. (5 -> 3 -> 2)=>1
  3. (4 -> 3 -> 1)=>0
  4. (4 -> 2)=>1
  5. (3 -> 1)=>0

最后结果:1+1+0+1+0=3,对比上面的数列,可以看到第5位正是3

©著作权归作者所有,转载或内容合作请联系作者