繁体   English   中英

为什么此函数返回-3?

[英]Why does this function return -3?

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

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

因为返回时您会再次调用它

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));

第三步

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

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

第四步

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));

编辑:

递归函数是这样的函数:它们在中断条件为true之前一直调用它们,在您的示例中,中断条件为x等于(=)或小于(<)小于0,然后打印结果。

第一个数字为17时,您会迷惑5,返回真断点条件为-3

您调用它一次,然后只要值大于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

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

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

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

返回x时,无需引用func

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM