如何在java中跟踪基本递归代码

如何在java中跟踪基本递归代码,java,recursion,Java,Recursion,我不熟悉递归,不了解它是如何工作的 这是一个课堂作业问题,答案是18,但我不明白怎么回答。据我所知,这应该返回递归行上的6+5+4+3+m-1 减法符号不表示减法吗?假设m=5 public int test(int m) { int value; if (m == 0) value = 3; else value = test(m - 1) + 3; return value; } 递归线上的6+5+4+3+m-1?这是减法吗 不表示减法的符号

我不熟悉递归,不了解它是如何工作的

这是一个课堂作业问题,答案是18,但我不明白怎么回答。据我所知,这应该返回递归行上的6+5+4+3+m-1

减法符号不表示减法吗?假设m=5

public int test(int m)
{
   int value;
   if (m == 0)
      value = 3;
   else
      value = test(m - 1) + 3;
   return value;
}
递归线上的6+5+4+3+m-1?这是减法吗 不表示减法的符号

不,每个递归调用都会发生+3,实际上函数的值是m乘以3+3

因此,对于m=5,递归调用如下所示:

m=0吗?不,所以让我们递归地调用:

测试4+3 m=4;然后测试3+3+3 m=3;然后测试2+3+3+3 m=2;然后测试1+3+3+3+3 m=1;然后测试0+3+3+3+3+3+3 m=0;然后以3+3+3+3+3+3+3退出 因此,对于m=5,得到18

一个旁注,您可以使用简化方法:

static public int test(int m) {
    return (m == 0) ? 3 : test(m - 1) + 3;
}
递归线上的6+5+4+3+m-1?这是减法吗 不表示减法的符号

不,每个递归调用都会发生+3,实际上函数的值是m乘以3+3

因此,对于m=5,递归调用如下所示:

m=0吗?不,所以让我们递归地调用:

测试4+3 m=4;然后测试3+3+3 m=3;然后测试2+3+3+3 m=2;然后测试1+3+3+3+3 m=1;然后测试0+3+3+3+3+3+3 m=0;然后以3+3+3+3+3+3+3退出 因此,对于m=5,得到18

一个旁注,您可以使用简化方法:

static public int test(int m) {
    return (m == 0) ? 3 : test(m - 1) + 3;
}

为了可视化发生的情况,请使用消息分散代码:

public int test(int m)
{
   System.out.println("entering test("+m+")");
   int value;
   if (m == 0)
      value = 3;
   else
      value = test(m - 1) + 3;
   System.out.println("returning "+value+" from test("+m+")");
   return value;
}
当然,这只是一个极小的程序,您还可以显示if的哪个分支,m-1,等等

JavaScript等效,因此它可以在浏览器中运行:

功能测试{ console.logentering测试+m+; var值; 如果m==0 数值=3; 其他的 值=testm-1+3; console.logreturning+value+来自测试+m+; 返回值; }
console.logresult:+test3 为了可视化发生的情况,请使用消息分散代码:

public int test(int m)
{
   System.out.println("entering test("+m+")");
   int value;
   if (m == 0)
      value = 3;
   else
      value = test(m - 1) + 3;
   System.out.println("returning "+value+" from test("+m+")");
   return value;
}
当然,这只是一个极小的程序,您还可以显示if的哪个分支,m-1,等等

JavaScript等效,因此它可以在浏览器中运行:

功能测试{ console.logentering测试+m+; var值; 如果m==0 数值=3; 其他的 值=testm-1+3; console.logreturning+value+来自测试+m+; 返回值; } console.logresult:+test3;