【问题标题】:Variable becomes undefined in recursive javascript function?递归javascript函数中的变量未定义?
【发布时间】:2013-03-31 07:20:04
【问题描述】:

我编写了一个简单的脚本,用于使用递归方法(欧几里得算法)查找最大公约数 (GCD) 和最小公倍数 (LCM)。

不幸的是,如果它需要在不止一个步骤中执行此操作,则要从函数返回的相关变量将变为未定义。我尝试在带有断点的调试器中跟踪它,它似乎充分遵循递归并适当地返回到原始函数,但它随后在函数末尾神秘地消失了,即使它是要返回的?

不知道为什么会发生这种情况或我能做些什么来解决它。我的代码如下:

function GCD(a, b) {
    if (a % b == 0) {
        return b;
    }
    else {
        GCD(b, (a % b));
    }
}

function LCM (a, b) {
    return (a*b)/GCD(a, b);
}

function makeDM (a, b) {
    return (GCD(a, b) + " " + LCM(a, b));
}

因此,如果您使用 a & b,例如 60、20,它会给出 20 和 60 的正确答案。但是,如果您使用诸如 20、60 或 126、35 之类的数字,它会非常失败。

【问题讨论】:

  • 我把你的代码粘贴到ideone.com 中试试,它在第 2 行给了我警告:使用 '===' 与 0 进行比较。
  • GCD 中的一个路径中没有return。这很可疑。
  • 这是你想要做的 -> FIDDLE ??
  • 您在 GCD 的最后一条语句中缺少 return
  • 谢谢大家!现在修复:)。我知道我错过了一些基本的东西。我猜是时候做更多的阅读了:D

标签: javascript function recursion


【解决方案1】:

您没有从函数的递归部分返回值,因此从函数返回的值将是undefined。添加return

function GCD(a, b) {
    if (a % b == 0) {
        return b;
    }
    else {
        return GCD(b, (a % b));
    }
}

你也可以用一个return写这个:

function GCD(a, b) {
    return a % b == 0 ? b : GCD(b, (a % b));
}

【讨论】:

  • 完美!非常感谢,我知道我一定错过了一些非常基本的东西,呵呵:)
猜你喜欢
  • 2020-04-25
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多