递归求和法

时间:2018-08-08 18:14:38

标签: java recursion methods

当被称为6时,我不理解以下代码的结果是sum(3)。有人可以解释吗?

public int sum(int number) {
    if (number == 1) {
        return number;
    } else {
        return number + sum(number - 1);
    }
}

5 个答案:

答案 0 :(得分:6)

这样想:如果我告诉你前一个sum的{​​{1}},你能告诉我当前number的{​​{1}}吗?如果我告诉你sumnumber是什么?好吧,显然sum(4) = 10

这是另一个挑战:基于此,您可以计算sum(5)吗?好吧,很显然sum(5) = 5 + sum(4) = 5 + 10 = 15-我们已经“知道” sum(7)的值的事实意味着我们可以直接用它代替(至少出于手工计算的目的)。

您已经有了:如果我在序列中的某个位置给您一个任意数字,您就会知道序列中后面的值如何与其相关。然后,您可以使用它来生成更多值。碰巧的是,最初写此书的人给了我们序列中的第一个值:sum(7) = 7 + sum(6) = 7 + 6 + sum(5) = 7 + 6 + 15 = 28。这(至少从理论上来说)使我们能够生成任何自然数的和。*(请参见下面的警告)。

顺便说一下,以下sum(5)循环基本上是等效的:

sum(1) = 1

我鼓励您与喜爱的调试器一起逐步完成操作,以使自己确信是这种情况。

顺便说一句,以下内容可能会有所帮助:What is a debugger and how can it help me diagnose problems?

for 注意:实际上,我们不能实际上使用它来生成任何自然数的和,因为我们最终会遇到一个自然数几个问题:

  1. 有无限数量的自然数,但是只有有限数量的内存。 (请注意,无穷大本身不是自然数,也不是实数,而是hyperreal number。)
  2. 最终,计算所需的时间将超过正常的人类寿命。例如,计算10 ^ 10的总和将需要167小时(即使您每秒执行一百万次操作)。以每秒1000000次操作计算10 ^ 20的总和将需要190,258,751个(即190个百万年)。
  3. public static int forSum(int number) { int ret = 0; for (int i = number; i >= 1; i--) { ret += i; } return ret; } 可以容纳多少数字有严格的限制。

但是,我们仍然对解决方案有一个数学说明:*-我们只是没有时间进行计算。

答案 1 :(得分:4)

这称为递归

如果您要调试此代码,则会看到类似以下内容的

.tab-contents>.active
{
display:block;
}

答案 2 :(得分:4)

说明

该方法将所有值累加到给定参数。参数为readonly string ConnectionString = "Data Source=***" readonly string queueName = "PJLTestQueue2"; SqlDependency.Start(ConnectionString, queueName); ,结果为3

因此,该方法使用recursion。也就是说,该方法会自行调用。它利用了

6 = 3 + 2 + 1

对于任何整数n。


迭代

首先让我们看一下不使用递归的等效方法:

sum(n) = n + sum(n - 1)

public static int sum(int number) { int result = 0; for (int i = number; i >= 1; i--) { result += i; } return result; } 调用的方法具有三个迭代。它将3添加到3,然后添加result,最后添加2,得到1


递归

您的递归方法做了类似的事情。它需要6并将3的结果添加到其中。 sum(2) = 2 + 1是用相同的技术计算的,它取sum(2)并加上2sum(1) = 1本身不会触发其他计算,因为它不会再次调用sum(1),请看一下您的代码:

sum

再次,让我们看一下代码:

if (number == 1)
    return number;

因此,使用return number + sum(number - 1); 进行调用会产生3,即3 + sum(3 - 1)。为了对此进行计算,必须使用参数3 + sum(2)再次调用方法sum。用2进行调用会产生2。为了对此进行计算,使用2 + sum(1)调用该方法。呼叫返回1

将所有内容代入回去:

1

答案 3 :(得分:0)

这是一种递归方法,输出n +(n-1)+ ... + 1。因此,sum(3)输出3+2+1=6

答案 4 :(得分:0)

当您使用参数3调用sum方法时,调用将变为3 + sum(2)。第二次调用变为2 + sum(1),第二次调用返回1。因此表达式2+ sum(1)返回3,而第一次调用3 + sum(2)将返回6。

相关问题