2014-02-26 26 views
2

是我第一次来这里,所以我不知道它是如何工作的,所以对错误感到抱歉。Java初学者 - 在简单代码上的错误

当我们以“aktueller Parameter”的形式给出数字3时,这个函数的结果是什么?

(原文:

Welches的Ergebnis liefert diese了Methode,德恩贝einem Aufruf ALS aktueller参数 德WERT 3ü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

你误以为'M'和'p' 。它是一个递归代码,计算为'3 * 3 + m(2)',第二部分变为'3 * 2 + m(1)',m(1)= 3,总计为9 + 6 + 3 = 18'。 – AntonH

+0

我认为“aktueller参数”==“实际参数”已经足够接近。 – ajb

+0

谢谢你俩的解释。 @AntonH和ajb – syiannop

回答

9

让我们打破这个递归调用:

随着m(3)p0,所以我们返回3*3 + m(2);

3*3 + (m(2)) 

随着m(2)p0,所以我们返回3*2 + m(1);

3*3 + (3*2 + m(1)) 

随着m(1)p0,所以我们返回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 
+0

非常感谢!这真的很有帮助! :d (我不能投票了,或者接受的答案) – syiannop

+0

你[获得投票最多的特权](http://stackoverflow.com/help/privileges)当您到达'15'的声誉,你总是允许接受一个你觉得在15分钟后最能帮助你解决问题的答案。 – rgettman

+0

感谢一角;) – syiannop

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),然后用右边的新参数写入函数(我们再次添加),等等。我从上工作底部。

我然后显示在右侧的结果和工作回来了。所以,我不写结果的时候了。

2

当你看到m(p-1),这意味着你再次从内部调用函数m,这被称为递归。

本质上,它所做的算法是3 * 3 + 3 * 2 + 3 * 1 = 18。

+0

这也非常有帮助:)谢谢你这么多 – syiannop

0

由于递归code.Please c中的STRACK跟踪

当你传递中的p值3,功能互动如下:

result = 3*p + m(p-1);  // 3*3 + m(2) = 9 
           // 3*2 + m(1) = 6 
           // 3*1 + m(0) = 3 
              ------- 
               18 
+0

ÿdownvote ????? – Kick