这是受到 Project Euler Q3 的启发。所以你们以前都见过。如果您还没有看到它,--> https://projecteuler.net/problem=3
我不是在解决问题之后。
递归对我来说还是很陌生。我将这段代码拼凑在一起,它给了我正确的解决方案(好吧,它给了我正确的因素),但是,我只能设法让它输出到控制台,而我想让它返回一个值某种可以在其他地方使用的类型,也许是某种类型或最大/最小类型的东西。我在想也许是一个包含因素的数组。不过就目前而言,我知道每当我在函数内部初始化一个数组时,它都会随着对该函数的每次递归调用而重新初始化。所以这没有用。
function primefy(n) {
var isPrime = true;
for (var i = 2; i < n; i++){
if(n % i === 0){
isPrime = false;
console.log(i);
primefy(n/i);
break;
}
}
if (isPrime){
console.log(n);
}
}
primefy(prompt("A number please?"));
如果我喂它 8 它将记录 2 2 2,18 产生 2 3 3 等等。数学似乎是正确的,但显然实现是错误的。
最佳答案
要从递归过程中返回一个值(而不是简单地沿途执行一些操作),函数的每个实例都需要返回一些东西直到调用它的实例(或者返回到原始调用者,如果它是根实例)。为此,它需要将其本地结果与其子级传递给它的结果相结合。
例如:
function primeFactors(n) {
for (var i = 2; i < n; i++){
if(n % i === 0){
return [i].concat(primeFactors(n/i));
}
}
return [n];
}
请注意,我们不再需要 isPrime
或 break
,因为我们将尽早返回
。当我们回到根时,我们已经建立了一个包含我们找到的所有因素的数组。我已重命名该函数以更好地反射(reflect)它实际返回的内容,但这是个人品味。
(顺便说一句,您不需要一直循环到 n
;您保证永远不会找到 Math.sqrt(n)
和n
在该循环内。)
关于javascript - 我怎样才能将这个递归 javascript 输出到控制台以外的任何地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112995/