如何使用递归总结给定整数以下的所有整数



马上,这不是一个家庭作业问题。我在业余时间练习递归问题,但我仍在围绕这个概念缠绕。我非常接近解决这个问题,但是当我一起总结它们时,我不知道如何跳过根整数" 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。

如何跳过根参数???

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

sum_sumBelow = n + sumBelow(n - 1);

to

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

在您的示例中;answer is 6将在控制台中输出3 2 1(您需要(?

n.b。绝不是最好的递归解决方案,但仍然是一个。

这相当于您使用ternary提供的整个功能:

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

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

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
}

嘿,安吉拉,您可以通过从下一个整数启动递归来跳过根。

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

递归函数的想法是仅使用我们重复提供的状态/参数执行自身。因此,递归功能本身无法分辨要跳过什么,除非我们专门在外部告诉它。我做了一个演示,以便您可以尝试一下。

对您的代码有所更改将满足您的想法。

更改行

  sum_sumBelow = n + sumBelow(n - 1);

to

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

仅考虑第一次迭代,您是在说

sum_sumBelow = n + sumBelow(n - 1);

如您所见,您正在添加N,但实际上您想添加1小于n。因此,相反,您会写

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

然后,在每次迭代中,您将少1个。因此,您将获得3 2 1 0。

而不是4 3 2 1

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

最新更新