【发布时间】:2017-06-04 02:07:07
【问题描述】:
我有以下问题。 我需要根据时间 t 计算一个数字 x,x 将表示为 M(t)。 我们有以下
- M(0) = 1
- M(1) = 1
- M(2) = 2
- M(2t) = M(t) + M(t + 1) + t(对于 t > 1)
- M(2t + 1) = M(t - 1) + M(t) + 1(对于 t >= 1)
话虽如此,我首先想到的是使用递归
function CalculateForTime(t) {
if (t == 0 || t == 1) {
return 1;
}
else if (t == 2) {
return 2;
}
else if (t % 2 == 0) {
t = t / 2;
return CalculateForTime(t) + CalculateForTime(t + 1) + t;
}
else {
t = (t - 1) / 2;
return CalculateForTime(t - 1) + CalculateForTime(t) + 1;
}
}
这可行,但是在运行大数 t 时会中断,例如 1^20
我尝试研究尾调用递归或将递归方法替换为迭代方法,但无法真正弄清楚。
如果尾递归或迭代是可行的方法,那么我需要帮助来转换它。如果没有,那么我愿意采用不同的方法来优化它。
谢谢, 奥马尔。
【问题讨论】:
标签: javascript performance recursion optimization