【问题标题】:Changing a function from iterative to recursive? [duplicate]将函数从迭代更改为递归? [复制]
【发布时间】:2010-10-06 11:58:31
【问题描述】:
projectEuler3(600851475143);

var projectEuler3 = function (composite) {
    var result = 2;
    while(composite > 1)
    {
        if (composite % result)
        {
            result++
        } else {
            composite = composite / result;
            console.log(result);
        }
    }
};

【问题讨论】:

  • @malfist:不要再编辑标签了。
  • 这不是家庭作业...我正在努力让我的大脑递归思考,这很有帮助。
  • 顺便说一句,让大脑了解递归的一个好方法是遍历二叉树。其中一种情况是递归通常是最好、最优雅的解决方案。

标签: javascript recursion


【解决方案1】:

希望本着 Project Euler(边做边学)和 SO(边问边学习)的精神,这里有一个相当通用的模板,用于将循环变成尾调用递归:

var projectEuler3 = function(n) {
    var pE3_inner = function(n, i) {
        // magic happens here

        // if neither n nor i has changed, this is an
        // infinite recursion (and usually a stack overflow)
        pE3_inner(n, i);
    }

    pE3_inner(n, 2);
}

【讨论】:

  • var pe3 = 函数 (o) { o = o || {复合:600851475143,结果:2}; if (o.composite
  • 是的!这是递归的一大缺点……它会产生很多堆栈。不过,在您的情况下,这应该无关紧要。只需选择一个较小的数字即可,这样您就可以验证您的代码是否符合您的预期。
  • 尝试将“
  • 我认为对象很烂所以我使用了闭包:var pe3 = function (composite) { var result = 2; return (function () { if (composite
  • ...工作到 9999995。再大一点就会爆炸...
【解决方案2】:

编辑:原来这个问题的设计目的是如何将算法(通常)从迭代更改为递归......而不是像我假设的那样,如何获得特定问题的答案。

这是给欧拉计划的! Project Euler 纯粹是为了您自己的利益...如果您要让其他人为您完成工作,您可能只需在 google 上的某个地方查找答案并输入。

我只能猜测您已经确定您的程序是正确的,但是它太慢了,您希望加快它的速度。让你的函数递归不会有帮助。

该网站指出,如果您的程序不能快速解决问题,有更好的方法...尝试不同的方法。

【讨论】:

  • 递归绝对不是加快代码速度的首选... Lol - +1
  • 是的,它来自欧拉项目。这就是为什么我这样标记它。但不,我不是想加快速度。运行它,它非常快。我想让我的大脑递归思考,这有助于实现这一目标。
  • @ShawnDumas...好吧,这很有道理! (我很高兴我没有赶上这个问题!)下一次,提供更多信息,希望能避免这些问题。查看 Ben Blank 的回复……他有一个通用模板,您或许可以应用。
  • 这绝对是我不清楚的情况!
【解决方案3】:

Structure and Interpretation of Computer Programs 介绍了迭代算法和递归算法之间的区别,如何识别哪个是哪个(在某些语言中不是很明显!),以及如何从一种转换到另一种。

除了是一本优秀的教科书。

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 2013-04-15
    • 1970-01-01
    • 2010-12-19
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多