如何使用递归对给定整数下的所有整数求和

时间:2017-06-01 03:29:32

标签: javascript algorithm recursion

马上,这不是一个功课问题。我在空闲时间练习递归问题,我仍然围绕着这个概念。我非常接近解决这个问题,但我无法弄清楚如何跳过根整数' n'当我把它们总结在一起的时候。这是迄今为止的代码:

var sumBelow = function (n) {
    console.log(n);
    // base case
    if (n === 0) {
        console.log('we hit the base case');
        return 0;
    }
    // initialize var to hold sum
    if (!sum_sumBelow) var sum_sumBelow = 0;
    // add numbers
    sum_sumBelow = n + sumBelow(n - 1);
    return sum_sumBelow;
};

console.log('answer is', sumBelow(4));

当我致电' sumBelow(4)'我想要的是3 + 2 + 1,但我现在得到4 + 3 + 2 + 1。

如何跳过根参数???

5 个答案:

答案 0 :(得分:4)

假设您正在正确打印所有内容,只需更改:

sum_sumBelow = n + sumBelow(n - 1);

sum_sumBelow = n - 1 + sumBelow(n - 1);

在你的例子中; answer is 6会在控制台中输出3 + 2 + 1,如你所愿?

N.B。这绝不是最好的递归解决方案,但它仍然是一个。

以下是@RobG使用三元组提供的整个函数的等效项:

function sumBelow(n) {return n ? n-1 + sumBelow(n-1) : 0}

答案 1 :(得分:2)

最简单的解决方案是两个独立的功能:

function sumUntil(n) {
    return n<=0 ? 0 : n + sumUntil(n-1);
}
function sumBelow(n) {
    return sumUntil(n-1);
}

但您也可以将所有数字减一:

function sumBelow(n) {
    return n<=1 ? 0 : (n-1) + sumUntil(n-1);
}
// equivalent to
function sumBelow(n) {
    const m = n-1;
    return m<=0 ? 0 : m + sumUntil(m); // make sure not to use m-1 for the recursive call
}

答案 2 :(得分:1)

Hey Angela你可以通过从下一个整数开始递归来跳过root。

var sumBelow = function (n) {
  return sum(n - 1);
};

function sum (n) {
  if (n === 0) return 0;
  return n + sum(n - 1);
}

递归函数的想法是仅使用我们重复提供的状态/参数来执行自身。因此,递归函数本身无法告诉要跳过的内容,除非我们在外部明确说明。我做了demo所以你可以尝试一下。

答案 3 :(得分:0)

对您的代码进行一些更改将符合您的想法。

更改行

  sum_sumBelow = n + sumBelow(n - 1);

  sum_sumBelow = n + sumBelow(n - 1) - 1 ;

答案 4 :(得分:0)

只考虑第一次迭代,你说的是

sum_sumBelow = n + sumBelow(n - 1);

正如您所看到的,您正在添加n,但实际上您想要添加小于n的1。所以,相反,你会写

sum_sumBelow = n-1 + sumBelow(n - 1);

然后,在每次迭代中,您将减少1次。因此,不是4 + 3 + 2 + 1,而是3 + 2 + 1 + 0。

您可能希望将基本情况更改为n === 1而不是0,因此您不添加零,但这并不重要。