重构javascript for循环使用递归来查找整数序列的总和

时间:2018-02-15 14:31:34

标签: javascript recursion refactoring

我没有太多的递归练习,我只有一些javascript经验。

如何重构下面的代码以使用递归而不是for循环?

 function add(a, b) {
    var sum = 0;    
    for (var i = a; i <= b; i++) {
            sum += i;
        }
        return sum;
    }
    
   console.log(add(3,7)); //25

for循环对我有意义;递归不是那么多。

2 个答案:

答案 0 :(得分:1)

对于后续tail call optimisation递归调用,您可以使用另一个参数作为最后一次调用的总和。

一开始,初始化s,保留求和结果并添加a

执行退出检查,如果达到目标值,则使用总和s进行exith。

否则,在减少起始值,给定结束值和实际总和的情况下再次调用该函数。

不要忘记返回通话的价值。

&#13;
&#13;
function sum(a, b, s) {
    s = s || 0;
    s += a;
    if (a === b) {
        return s;
    }
    return sum(a + 1, b, s);
}

console.log(sum(3, 7));
&#13;
&#13;
&#13;

如果没有尾部优化,这会将所有中间结果保留在堆栈中。

&#13;
&#13;
function sum(a, b) {
    if (a === b) {
        return a;
    }
    return a + sum(a + 1, b);
}

console.log(sum(3, 7));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

方便:

function recursive(a, b)
{
  if(a > b)
  {
    return 0;
  }
  return a + recursive(a+1, b);
}

console.log(recursive(3,7));

HARD WAY:(EASY + EXPLANATION)

什么是通用编程语言的递归?

根据Wikipedia:计算机科学中的递归是一种方法,其中问题的解决方案依赖于对同一问题的较小实例的解决方案(而不是迭代)。

在日常语言中翻译,当你迭代n次函数(在这种情况下)和每次函数调用自己等待调用函数的实例的结果时递归。

调用函数的intance将再次调用自己并等待结果。

当这个无限循环停止时?

当一个实例最终返回一个值时,通常在递归调用之前进行检查(参见简单方法)。

当一个函数返回一个值时,所有结都将松动,并且启动循环的第一个函数将返回最终值。

如果你想深入或只是我的简短解释并不令人信服我重新阅读这篇文章:https://www.codecademy.com/en/forum_questions/5060c73fcfadd700020c8e54