递归和方法

slu*_*ede -5 java methods recursion

我不明白以下代码的结果如何6被称为sum(3).有人可以解释一下吗?

public int sum(int number) {
    if (number == 1) {
        return number;
    } else {
        return number + sum(number - 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

EJo*_*ica 6

想一想:如果我告诉你sum之前的情况number,你能告诉我sum当前的情况number吗?如果我告诉你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.这(至少在理论上)允许我们为任何自然数生成总和.*(参见下面的警告).

顺便提一下,以下for循环基本相同:

public static int forSum(int number)
    {
        int ret = 0;

        for (int i = number; i >= 1; i--)
        {
            ret += i;
        }

        return ret;
    }
Run Code Online (Sandbox Code Playgroud)

我鼓励您使用您最喜欢的调试器来完成此操作,以说服自己就是这种情况.

顺便提一下,以下内容可能会有所帮助:什么是调试器,它如何帮助我诊断问题?

* 警告:实际上,我们实际上无法使用它来生成任何自然数的总和,因为我们最终会遇到以下几个问题之一:

  1. 有无数个自然数,但只有有限的内存.(注意,无穷大本身不是自然数,甚至不是实数,而是超实数).
  2. 最终,计算所花费的时间长度将超过正常的人类寿命.例如,计算10 ^ 10的总和将花费将近167小时(即使您每秒进行一百万次操作).计算10 ^ 20的总和需要190, 258,751 (即超过1.9 亿年),每秒1000000次操作.
  3. 对一个数字的大小有一个很大的限制int.

但是,我们仍然有解决方案的数学规范:sum(10^20) = 10^20 + sum(10^20 - 1)- 我们没有时间来计算它.