为什么此函数返回-3?

时间:2019-02-13 14:02:42

标签: javascript function

当我尝试使用此功能时,控制台的日志为-3,但是当我自己进行计算时,它似乎会返回12。为什么?

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

5 个答案:

答案 0 :(得分:4)

因为返回时您会再次调用

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等于(=)或小于(<)小于0,然后打印结果。

在第17个数字中,您获得第5个返回真断点条件的数字是-3

答案 1 :(得分:1)

您调用它一次,然后只要值大于0,它就会继续调用自身(在第二次返回时)。因此,它将继续进行直到值小于0,然后返回最终结果。

答案 2 :(得分:1)

是的,您应该得到-3。您的递归函数说,将x减5直到x小于或等于0。因此,第一次迭代将是12,然后是7,然后是2,最后是-3,它满足小于或等于0的条件,然后返回x

答案 3 :(得分:1)

当方法调用自身直到满足特定条件时。在此示例中,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

答案 4 :(得分:0)

正如其他答案所说的那样,它返回-3的原因是由于递归,而且是因为您从自身内部调用了函数。

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

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

返回func时无需引用x