当我尝试使用此功能时,控制台的日志为-3,但是当我自己进行计算时,它似乎会返回12。为什么?
function func(x) {
if (x <= 0) {
return x;
}
return func(x - 5);
}
console.log(func(17));
答案 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
。