简单的递归示例 - 请帮助我理解递归

时间:2011-04-04 02:04:40

标签: java math recursion

    public static int triple(int n)
    {
        if (n == 0)
            return 0;
        else
            total = 3 + triple(n-1);
    System.out.println(total);
    return total;
    }

好的,所以我有一个简单的回忆示例,我似乎无法掌握,我希望有人能够让我逐步了解程序如何获得其输出。

这是我认为会发生的事情。让我们说n=5 所以,程序循环并点击total = 3 + triple(5-1) 我认为这将等于7 ..这是错误的 程序打印

  

3
  6
  9
  12个
  15个

所以...然后我认为三重必须在打印总数之前再次运行...我相信它确实如此但我根本不理解它总是如何达到它的总和。

因为它看起来像这样:

3 + triple(4)
       3 + triple(3)
               3 + triple(2)
                       3 + triple(1)
                                =3

有人可以解释一下,因为我可能会非常迷失!

7 个答案:

答案 0 :(得分:6)

你的解释有点不对劲。它更像是这样:

triple(5) = 3 + triple(4)
triple(4) = 3 + triple(3)
triple(3) = 3 + triple(2)
triple(2) = 3 + triple(1)
triple(1) = 3 + triple(0)
triple(0) = 0

现在假设triple(0)triple(1)等都是个别变量,并通过逐步解决triple(5)来解决。

答案 1 :(得分:1)

所以它不会工作到零(通过减1)然后再加3(0 3 6等)。

这是我得到的输出:

n:5
n:4
n:3
n:2
n:1
n:0
total:3
total:6
total:9
total:12
total:15

它正在做的是从每个枚举中减去一个,然后将3添加到现在的0-5

答案 2 :(得分:1)

您的输出应如下所示:

3 = triple(1) = 3+triple(0)
6 = triple(2) = 3+triple(1)
9 = triple(3) = 3+triple(2)
12 = triple(4) = 3+triple(3)
15 = triple(5) = 3+triple(4)

这是因为triple(n)会在打印出消息之前调用三(n-1)。因此,您的三(5)条消息将最后打印出来。

答案 3 :(得分:0)

当执行命中该点,三重方法开始从开始再次执行。一旦它返回,执行将在下一行继续。这发生递归

因此执行顺序如下:

  1. 如果(N == 0)// n ==可5在这一点上,条件为假
  2. 总= 3 +三元组(N-1)//我们必须计算三元组(4)
  3. if(n == 0)// n == 4 now。
  4. total = 3 + triple(n-1)//我们必须计算三(3)
  5. ......等,直到n确实== 0:
  6. if(n == 0)// true!
  7. return 0 //返回0
  8. 总= 3 + 0 // 0来自三重第(n-1),它刚刚返回0
  9. 的System.out.println(总); //打印3
  10. 返回总数; //返回3
  11. 总数= 3 + 3; //再次3来自triple(n-1),其中n == 2
  12. 的System.out.println(总); //这次打印6次
  13. ......等等。
  14. 注意定义的函数只是将输入乘以3,并在每个倍数打印结果。

答案 4 :(得分:0)

public static int triple(int n)
{

if (n == 0)
return 0;
else
return 3 + triple(n-1);
System.out.println(return);
}

忽略println(返回)仅用于理解目的。这就是我如何分解它以最终掌握递归函数/方法。

triple(3)
return 3 + triple(3-1)_is_6<---- (return = 9)<--
println(return)

    triple(2)
    return 3 + triple(2-1)_is_3<-- (return = 6)<----
    println(return);

              triple(1)
              return 3 + triple(1-1)_is_0<---- (return = 3)<--
              println(return)

                       triple(0)
                       return 0; is 0 (return = 0)<----
                       (no println for n==0)

谢谢大家帮助理解这一点。我没做的就是记住每个三元组(n-1)返回自己的值,然后将其计算到它上面的调用中。

再次感谢!

答案 5 :(得分:0)

triple(0) = 0
triple(1) = 3 + triple(0) i.e. 3+0=3
triple(2) = 3 + triple(1) i.e. 3+3=6
triple(3) = 3 + triple(2) i.e. 3+6=9
triple(4) = 3 + triple(3) i.e. 3+9=12
triple(5) = 3 + triple(4) i.e. 3+12=15

答案 6 :(得分:0)

您对Triple(n-1)和(n-1)之间感到困惑。它们是不同的东西,因此您不能只将值分配给三元组(n-1)内的n并将其加到3