【问题标题】:How can i make this recursive javascript output to anything other than the console我怎样才能将此递归javascript输出到控制台以外的任何东西
【发布时间】:2015-05-07 22:54:05
【问题描述】:

这是受到 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 等等。数学似乎是正确的,但显然实现是关闭的。

【问题讨论】:

标签: javascript recursion factorization


【解决方案1】:

要从递归过程中返回一个值(而不是简单地执行一些操作),函数的每个实例都需要返回一些内容到调用它的实例(或者返回到原始调用者,如果它是根实例)。为此,它需要将其本地结果与其子级传递给它的结果相结合。

例如:

function primeFactors(n) {
    for (var i = 2; i < n; i++){
        if(n % i === 0){
            return [i].concat(primeFactors(n/i));
        }
    }
    return [n];
}

请注意,我们不再需要isPrimebreak,因为我们将尽早使用return。当我们回到根时,我们已经建立了一个包含我们找到的所有因素的数组。我已重命名该函数以更好地反映它实际返回的内容,但这是个人喜好。

(顺便说一句,您不需要一直循环到n;保证您永远不会在该循环内找到Math.sqrt(n)n 之间的因子。)

【讨论】:

  • 感谢@S Mc Crohan。我今天早上对其进行了重新设计,至少可以让嵌套数组返回。但是您的解决方案仍然更可爱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
相关资源
最近更新 更多