当被称为6
时,我不理解以下代码的结果是sum(3)
。有人可以解释吗?
public int sum(int number) {
if (number == 1) {
return number;
} else {
return number + sum(number - 1);
}
}
答案 0 :(得分:6)
这样想:如果我告诉你前一个sum
的{{1}},你能告诉我当前number
的{{1}}吗?如果我告诉你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
我鼓励您与喜爱的调试器一起逐步完成操作,以使自己确信是这种情况。
顺便说一句,以下内容可能会有所帮助:What is a debugger and how can it help me diagnose problems?
for
注意:实际上,我们不能实际上使用它来生成任何自然数的和,因为我们最终会遇到一个自然数几个问题:
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)
并加上2
。 sum(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。