在Ruby和JS中编写了相同的函数,Ruby工作但JS未定义

时间:2015-10-22 04:39:15

标签: javascript

我想尝试递归来计算复合兴趣而不是循环。

在Ruby中:

def compound balance, percentage
  balance + percentage / 100 * balance
end

def invest amount, years, rate
  return amount if years == 0
  invest compound(amount, rate), years - 1, rate
end

这很好用。 1年后5万美元的10,000美元是10,500美元; 10年后,16,288美元。

现在JavaScript中的逻辑相同(ES6)。

function compound(balance, percentage) {
    return balance + percentage / 100 * balance;
}

function invest(amount, years, rate) {
    if (years === 0) {
        return amount;
    } else {
        invest(compound(amount, 5), years - 1, rate);
    }
}

这会返回undefined,但我无法弄清楚原因。它使用正确的参数调用invest正确的次数,逻辑是相同的。 compound函数有效,我单独测试了它。那么......可能出现什么问题?

1 个答案:

答案 0 :(得分:5)

如果逐步代码“脱落”函数的末尾,则Ruby函数会自动返回最后一个表达式的值。 JavaScript(以及大多数其他编程语言)这样做,因此您需要明确地返回else子句中的值:

function invest(amount, years, rate) {
    if (years === 0) {
        return amount;
    } else {
       return invest(compound(amount, 5), years - 1, rate);
    }
}

或者使用条件运算符:

function invest(amount, years, rate) {
    return years === 0 ? amount : invest(compound(amount, 5), years - 1, rate);
}