2013-04-25 102 views
0

任何人都可以用幾條註釋行解釋這些方法。他們是爲了打一個數字。一種是使用遞歸,實現另一種是隻是正常Java Square函數

public static int sq(int n) 
{ 
    int i = 0 ; 
    int result = 0 ; 

    while(i < n){   
     result = result + 2*i + 1 ; 
     i = i + 1 ; 
    } 
    return result ; 
} 

public static int recSq(int n) 
{ 
    if(n == 0){ 
     return 0 ; 
    } else { 
     return recSq(n - 1) + 2*(n - 1) + 1 ; 
    } 
} 

public static int implementSq(int n) 
{ 
    int i ; 
    int result = 0 ; 

    for(i = 0 ; i < n ; i++){ 
     result = result + 2*i + 1 ;  
    } 
    return result ; 
} 
+0

它們在結果函數中都是相同的。 sq使用while循環,而implement件sq使用for循環。 recSq是一個遞歸函數,它爲每個遞歸調用自己調用一個n - 1(直到n等於零)和2 *(n - 1)+1)。 – 2013-04-25 10:14:30

回答

0
  • 第一個是用一個循環增加一個局部變量i乘以2 n次。
  • 第二個是完全相同,但使用遞歸。每個步驟減少n並返回0以表示最終情況。所有的調用再次調用相同的函數,使用參數值爲0的不同參數,然後該函數返回0.遞歸不是一件簡單的事情,想要更好地理解它,試着想象一下代碼流。

例子:recSq(2)

4 recSq(2) 
    |<- 1 reqSq(1)+2*1+1 
     |<-0 reqSq(0)+2*0 + 1 
     |<- 0 

reqSq(2)被調用,所以我們將EVAL if和開始評估return語句。第一個操作是調用reqSq(n-1)作爲n = 2的方法,然後調用reqSq(1)。

reqSq(1)被調用,所以我們將評估if並開始評估返回語句。第一個操作是調用reqSq(n-1)作爲n = 1的方法,然後調用reqSq(0)。

reqSq(0)被調用,所以我們將在EVAL如果這是真的觸發N == 0,然後我們返回0

reqSq(1)調用已完成評估reqSq(0),那麼我們就可以我們將返回值1.

reqSq(2)已經完成了對reqSq(1)的評估,然後我們可以繼續計算其餘的0 + 2 *(n-1)+ 1 - > 0 + 0 +計算其餘的1 + 2 *(n-1)+1→1 + 2 + 1.我們將返回值4.我們將返回值4.

  • 最後一個是for循環,幾乎與第一個但是使用fors而不是while循環。在for循環中,您可以在一行中聲明初始化條件,繼續條件和增加操作。所以在這種情況下,for循環以值0開始,循環將繼續,因爲我將在012循環結尾處調用「i ++」。
0

爲什麼你想解決與遞歸或循環這樣一個簡單的問題?

public static int sq(int n) { 
    return n * n; 
} 

就是這樣。

+0

他可能試圖瞭解他們做了什麼,而不是如何排列數字。 – Khanser 2013-04-25 10:17:56

+0

我只是想了解復活和實施 – user2319199 2013-04-25 10:20:30

1

我認爲這一定是一個家庭作業練習,否則它是一種瘋狂的方式去做任何事情。因此,我可以建議使用集成開發環境(例如Netbeans),然後使用它逐行執行代碼。這是瞭解代碼的最簡單方法。如果我們只是告訴你,你不會因此而獲益。