试图找出递归基础知识

Trying to figure out recursive basics

如果有人能向我解释我编写的这段代码与我认为它会产生的结果有何不同,我将非常高兴。我写了代码试图证明 int n 将成为 n = 4 所以在我的脑海和纸上我认为我一步一步的结果如下:

  1. 4 * 4 + (3) = 19

  2. 3 * 3 + (2) = 11

  3. 2 * 2 + (1) = 5

  4. 1 * 1 + (0) = 1

  5. return 0

    谁能告诉我为什么不是这样?并引导我完成递归步骤?

    public static void main(String[] args) {
    
             Scanner kbd = new Scanner(System.in);
    
             int n;
             System.out.println("Enter a number: ");
             n = kbd.nextInt();
    
            System.out.println("recursive value "+intValue(n));
       }
       public static int intValue(int n)
       {
             int total;
             int x;
            if(n == 0)
               return 0;
            else 
              total = n * n + intValue(n-1);
              System.out.println("Recursive total: "+total);
              return total;
      }
    

这是递归步骤,从 n 开始是 4:

intValue(4)
  n is not 0.  total is 4 * 4 + intValue(3)
  intValue(3)
    n is not 0.  total is 3 * 3 + intValue(2)
    intValue(2)
      n is not 0.  total is 2 * 2 + intValue(1)
      intValue(1)
        n is not 0.  total is 1 * 1 + intValue(0)
        intValue(0)
          n is 0, intValue(0) returns 0.
        1 * 1 + 0 = 1.
        Print Recursive value: 1, intValue(1) returns 1.
      2 * 2 + 1 = 5.
      Print Recursive value: 5, intValue(2) returns 5.
    3 * 3 + 5 = 14.
    Print Recursive value: 14, intValue(3) returns 14.
  4 * 4 + 14 = 30.
  Print Recursive value: 30, intValue(4) returns 30.

回到 main,初始调用 returns 30,它打印 recursive value 30.

递归调用不会return n - 1本身被添加;它 return 是使用 n - 1 作为参数再次调用 intValue 的结果。

所以你的递归方程是

total = n * n + intValue(n-1);

当你 运行 它与 4 时,它是

4 * 4 + intValue(3)

在这种情况下 intValue(3)

3 * 3 + intValue(2)

在这种情况下 intValue(2)

2 * 2 + intValue(1)

在这种情况下 intValue(1)

1 * 1 + intValue(0)

在这种情况下 intValue(0)

0

在这种情况下,intValue(1)

1 * 1 + intValue(0) = 1*1 + 0 = 1;

在这种情况下,intValue(2)

2 * 2 + intValue(1) = 2 * 2 + 1 = 5

在这种情况下 intValue(3)

3 * 3 + intValue(2) = 3 * 3 + 5 = 14

在这种情况下 intValue(4)

4 * 4 + intValue(3) = 4 * 4 + 14 = 30

关于递归的事情是它不断调用自己直到它到达点 n == 0 return。您尝试在纸上解决问题的方式是颠倒的。

直到n == 0,它才会对你的方程求值,所有的递归调用基本上都堆叠起来等待结果。所以它得到了这样的结果,(括号中的每个操作都在等待递归调用的结果):

总计 = 4 * 4 + (3*3 + (2 * 2 + (1 * 1 + 0)))

评估 5.(堆栈顶部),n = 0,return 0
4. n = 1, 1 * 1 + 0, return 1
3. n = 2, 2 * 2 + 1, return 5
2. n = 3, 3 * 3 + 5, return 14
1. n = 4, 4 * 4 + 14, return 30