Raj*_*amy 8 javascript recursion
这是我目前正在进行的功能:
function getSmallestDivisor(xVal) {
if (xVal % 2 === 0) {
return 2;
} else if (xVal % 3 === 0) {
return 3;
} else {
var xSqrt = Math.sqrt(xVal);
if (xSqrt % 1 === 0) {
getSmallestDivisor(xSqrt);
} else {
return xVal;
}
}
}
alert(getSmallestDivisor(121));
Run Code Online (Sandbox Code Playgroud)
我设计了上面的函数来返回整数的最小除数.考虑这个案子121.它应该实际返回11当前的上下文.但它正在回归undefined.
我检查了递归调用发生的次数; 他们实际上发生了两次.我记录了xVal这两个不同调用的值,并显示121和11.我真的很困惑这个函数目前正在返回的原因undefined.
我创建了一个jsfiddle演示.
Set*_*day 25
其他人给出了正确的答案,但我想明确原因,因为对某些人来说可能并不明显(不是针对OP).
功能只不过是计算机采取的一系列步骤.
这称为函数调用:
getSmallestDivisor(121)
Run Code Online (Sandbox Code Playgroud)
无论何时使用该return关键字,该函数都会停止并用该返回单词之后的任何内容替换函数调用(它可能没有任何内容).
所以在这种情况下,原始函数的问题是当脚本到达这一行时......
getSmallestDivisor(xSqrt);
Run Code Online (Sandbox Code Playgroud)
...它返回11到该函数调用,它永远不会返回到内部发生的原始函数调用alert().
所以解决方案只是return在它自己调用的那个之前添加一个.
return getSmallestDivisor(xSqrt);
Run Code Online (Sandbox Code Playgroud)
这是递归函数时常见的错误.帮助弄清楚发生了什么的好方法是广泛使用浏览器控制台.
function getSmallestDivisor(xVal) {
console.log("This is xVal: " + xVal);
if (xVal % 2 === 0) {
console.log("xVal % 2 === 0 was true");
return 2;
}
else if (xVal % 3 === 0) {
console.log("xVal % 3 === 0 was true");
return 3;
}
else {
console.log("This is else.");
var xSqrt = Math.sqrt(xVal);
console.log("This is xSqrt of xVal: " + xSqrt);
if (xSqrt % 1 === 0) {
console.log("xSqrt % 1 === 0 was true... recursing with xSqrt!!!");
getSmallestDivisor(xSqrt);
}
else {
console.log("This is the else inside of else. I am returning: " + xVal);
return xVal;
}
}
}
var y = getSmallestDivisor(121);
console.log("This is y: " + y);
Run Code Online (Sandbox Code Playgroud)
现在在您的浏览器中,您可以打开控制台(Chrome/Mac上的Option + Command + J)并观察正在发生的事情 - 执行哪些部分等.
Aru*_*hny 22
if (xSqrt % 1 === 0) {
return getSmallestDivisor(xSqrt); // missing return here
} else {
return xVal;
}
Run Code Online (Sandbox Code Playgroud)
演示:小提琴