是我第一次来这里,所以我不确切知道它是如何运作的,所以对于这些错误感到抱歉。
当我们给出“aktueller参数”3号时,这个函数的结果是什么?
(原文:
Welches Ergebnis liefert diese Methode,wenn bei einem Aufruf als aktueller参数 der Wert3übergebenwird?
我正在学习德语,所以我真的不懂英语术语:/)
public int m(int p)
{
int result;
if (p == 0)
{
result = 0;
}
else
{
result = 3*p + m(p-1);
}
return result;
}
我已经尝试过了,答案是18,但是当我试图在没有任何程序的情况下尝试这样做时,我找到的答案是15:
result = 3 * 3 + 3(3-1);
有人可以解释一下,为什么18岁而不是15岁?我假设我做错了。
提前谢谢。
答案 0 :(得分:9)
让我们分解这个递归调用:
m(3)
p
不是0
,因此我们返回3*3 + m(2);
。
3*3 + (m(2))
m(2)
p
不是0
,因此我们返回3*2 + m(1);
。
3*3 + (3*2 + m(1))
m(1)
p
不是0
,因此我们返回3*1 + m(0);
。
3*3 + (3*2 + (3*1 + m(0))
m(0)
p
为0
,因此我们返回0
。然后递归调用堆栈展开。
3*3 + (3*2 + (3*1 + (0)) =
9 + (6 + (3 + 0)) =
9 + (6 + 3) =
9 + 9 =
18
答案 1 :(得分:2)
当您看到m(p-1)
时,这意味着您正在从内部再次调用函数m
,这称为递归。
基本上,它所做的算术是3 * 3 + 3 * 2 + 3 * 1 = 18。
答案 2 :(得分:0)
// Original argument is 3
3*3 + m(3-1) // Step #1 New argument is 3 - 1
3*2 + m(2-1) // Step #2 New argument is 2 - 1
3*1 + m(1-1) // Step #3 New argument is 1 - 1
// p == 0 Return 0
3*1 + 0 = 3 // Step #4 Return 3
3*2 + 3 = 6 + 3 = 9 // Step #5 Return 9
3*3 + 9 = 9 + 9 = 18 // Step #6 Return 18, which is the final value
以下是我喜欢处理递归函数的方法,这是个人偏好。从顶部开始,将已知值组合在一起,然后在侧面编写函数,在这种情况下我们只需添加它。然后,在下一行,再次写入已知值(这次,其中一个是少一个(2,而不是3),并使用右边的新参数编写函数(我们再次添加),等等。我从上到下工作。
然后我在右侧显示结果并重新开始工作。所以,我不会立即写出结果。
答案 3 :(得分:0)
由于递归代码。请查看堆栈跟踪
当您将p值传递为3时,该函数将如下进行交互:
result = 3*p + m(p-1); // 3*3 + m(2) = 9
// 3*2 + m(1) = 6
// 3*1 + m(0) = 3
-------
18