2014-09-05 56 views
0

我需要指導理解遞歸。查看數組方法

以下是我有:

public class ArrayMember 
{ 
    public static void main(String[] args) 
    { 
     int index = 0; 
     int [] arr = {1, 5, 6, 2}; 

     System.out.println(member(arr, index)); 
    } 

    public static String member(int [] arr, int index) 
    { 
     if(index == arr.length) 
      return str; 

     str = index + "\t" + str + "\n"; 

     return str + member(arr, index+1); 
    } 
} 

正如你所看到的,這將永遠不會一路攀升至20,並始終打印「否」。我很確定有一個for循環會打敗這個目的,但我想不出有任何其他的方式來做到這一點。任何幫助,將不勝感激。

+2

一個問題是,即使你找到的位置'i'的元素,你覆蓋'str'與'不'當位置'i + 1'有不同的元素時。嘗試從循環中「斷開」,一旦找到該值,或者默認將'str'初始化爲'No',並且只在循環中將其設置爲'Yes',但不回到'No'。 – 2014-09-05 22:14:44

+0

@tobias_k你能解釋我如何覆蓋str嗎?不應該是str + str + ...等等嗎?每個str保存在該迭代期間分配的字符串,然後連接。默認情況下將str設置爲「No」確實有助於順便說一句。 – cress 2014-09-05 22:22:57

回答

3

有兩個問題與您的代碼:

  1. 通過在循環的每次迭代設置str,即使你找到的元素i位置,您覆蓋str"No"當存在不同的元素位置i+1,有效地將str設置爲元素是否是數組中的最後一個元素。一旦找到該值,嘗試從循環中嘗試break,或者默認初始化str"No",如果找到該值,則僅將其設置爲"Yes"
  2. 通過檢查index == arr.length您並未測試從1到20的所有數字。您可以改爲檢查index > arr[arr.length-1],即檢查它是否大於列表中的最後一個元素,但這僅在列表排序後纔有效。

這應該修復你的代碼。不過,說實話,我認爲你有點誤會了這項任務(儘管我不得不承認,從一開始就不是很清楚)。而不是使用遞歸來測試後續數字(以及你不知道什麼時候停止的問題),並且使用循環來測試數組的不同位置,我會反轉它:使用循環來測試不同的數字你想測試,並使用數組中的不同位置遞歸。

這種方式,可以簡化程序,以這個(僞):

function member(arr, num, index) -> bool : 
    if index does not exceed array 
     return arr[index] equals num or member(arr, num, index+1) 
    else 
     return false 

arr = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} 
for i from 1 to 20 
    print i, member(arr, i, 0) 
+0

非常感謝,我得到它的工作!這非常有幫助。我想我可以說我現在理解遞歸更好。 – cress 2014-09-05 22:56:03