Javascript 为什么这个函数返回-3?

Javascript 为什么这个函数返回-3?,javascript,function,Javascript,Function,当我尝试这个函数时,它的控制台记录为-3,但当我自己计算出来时,它似乎会返回12。为什么会这样 function func(x) { if (x <= 0) { return x; } return func(x - 5); } console.log(func(17)); 您调用它一次,然后它在第二次返回时继续调用自己,只要该值大于0。所以它一直运行,直到值低于0,然后返回最终结果。没错,您应该得到-3。你的递归函数说一直减去x乘5,直到x小于或等于0。因此,第

当我尝试这个函数时,它的控制台记录为-3,但当我自己计算出来时,它似乎会返回12。为什么会这样

function func(x) {
  if (x <= 0) { 
    return x; 
  }
  return func(x - 5);
}
console.log(func(17));

您调用它一次,然后它在第二次返回时继续调用自己,只要该值大于0。所以它一直运行,直到值低于0,然后返回最终结果。

没错,您应该得到-3。你的递归函数说一直减去x乘5,直到x小于或等于0。因此,第一次迭代将是12,然后是7,然后是2,最后是-3,满足小于或等于0的条件,然后在方法调用自身时返回x,直到满足特定条件。在本例中,func方法将继续调用自身,将x-5作为参数传递,直到小于0,此时它将返回当前值x。因此,调用堆栈将如下所示:

func(17)

is (17 <= 0)? No
func(17 - 5)

is(12 <= 0)? No
func(12 - 5)

is(7 <= 0)? No
func(7 - 5)

is(2 <= 0)? No
func(2 - 5)

is(-3 <= 0) Yes!
return -3

因为在回程时你又打了一次电话

function func(x) { <-- x=17

if (x <= 0) { 
return x; 
}
 return func(x - 5); <---x=12 so now you call the func with 12
}
console.log(func(17));
步骤2

function func(x) { <-- x=12

if (x <= 0) { 
return x; 
}
 return func(x - 5); <---x=7 you call with 7 
}
console.log(func(17));
步骤3

function func(x) { <-- x=7

if (x <= 0) { 
return x; 
}
 return func(x - 5); <---x=2 you call with 2
}
console.log(func(17));
步骤4

function func(x) { <-- x=2

if (x <= 0) { 
return x; 
}
 return func(x - 5); <---x=-3 you call with -3
}
console.log(func(17));
最后一步

function func(x) { <-- x=-3

if (x <= 0) { 
return x; <--- now you print the result
}
 return func(x - 5); 
}
console.log(func(17));
编辑:


递归函数是在中断条件为真之前调用自己的函数,在您的示例中,中断条件为x,等于或小于,正如其他答案所说,它返回-3的原因是递归,并且是因为您从函数本身内部调用了函数

但是,如果您希望输出为12,我还想添加我认为您正在尝试编写的代码:


由于递归,返回x时不需要引用func.

。添加函数funcx{console.logx;并查看发生了什么事情Git是一个递归函数,它一直被调用,直到x变为负值,因为17-5-5-5-5=-3
function func(x) {
  if (x <= 0) { 
    return x; 
  }
  return x - 5;
}
console.log(func(17)); // <---12