Java初学者 - 错误的简单代码

时间:2014-02-26 17:11:37

标签: java

是我第一次来这里,所以我不确切知道它是如何运作的,所以对于这些错误感到抱歉。

当我们给出“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岁?我假设我做错了。

提前谢谢。

4 个答案:

答案 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) p0,因此我们返回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