2017-02-27 111 views
1

我正在教導自己AP計算機科學A在教科書,YouTube和在線發現的工作表的幫助下。其中一個工作表是在遞歸中,並要求我將下面的代碼轉換爲遞歸,但是,教科書或YouTube都不能解釋如何從迭代轉換爲遞歸。將迭代轉換爲遞歸

public static int iterative(int x){ 
     int count=0; 
     int factor=2; 
     while(factor<x){ 
      if(x%factor==0) 
       count++; 
      factor++; 
     } 
     return count; 
    } 

下面的代碼是我的嘗試,但我不斷收到一個StackOverFlowError。

public static int recursion(int x){ 
    int count=0; 
    int factor=2; 
    if(factor>x) 
     return count; 
    else if(x%factor==0){ 
     factor++; 
     count++; 
    } 
    return count + (recursion(x)); 
} 

有人可以請解釋如何從迭代轉換爲遞歸嗎?謝謝。

+0

很高興看到你的問題在這裏受到好評。添加嘗試是一個很好的接觸。 – CandiedOrange

回答

1

正如JackVanier針對這個問題已經解釋的那樣,您將不得不傳入factor作爲方法參數。但是公共方法簽名應該保持不變,所以你必須編寫兩個新的方法:一個是可公開訪問的,具有預期的簽名,另一個是真正的遞歸併由另一個方法調用。

public static int recursive(int x) { 
    return recursive(x, 2); 
} 

private static int recursive(int x, int factor) { 
    if (factor >= x) 
     return 0; 
    if (x % factor == 0) 
     return 1 + recursive(x, factor + 1); 
    return recursive(x, factor + 1); 
} 

還值得一提的是,您需要一個停止遞歸的停止條件。這是你已經得到正確的東西,這是最終類似於true在任何情況下的factor >= x條件。

2

您需要將因子作爲變量傳遞給方法。所以方法簽名看起來像public static int recursion(int x, int factor)。因爲你有它的因素的方式始終是2,因爲每次調用factor變量被重置爲2

1
public static int recursion(int x, int factor) 
{ 
    int count=0; 

    if(factor>x) 
     return count; 
    else if(x%factor==0) 
    { 
     ++factor; 
     ++count; 
    } 

    return count + (recursion(x, factor)); 
} 

唯一不同的是改變了頭部的方法,去除INT係數= 2,return語句在底部。當使用遞歸而不是迭代時,您必須按照一般規則傳遞更多變量。否則,您遇到的StackOverFlowError問題是由於您傳遞了更新的因子值而引發的。這導致默認情況永遠不會是真實的,並且基本上創建了一個無限循環,只是因爲調用方法佔用大量資源,並且在未達到默認情況下會拋出該錯誤。默認情況是:return count;當if語句(factor> x)成立時。