2013-10-29 26 views
0

當我試圖遞歸搜索時,我沒有返回正確的數字。我使用它來遍歷一個使用單鏈表實現的隊列,並返回該項目所在的索引,以便我可以確定需要多少次才能使用dequeue()來獲取該項目。在遞歸方法中返回錯誤計數

public int search(E item) { 
    return recSearch(item, head); 
} 

public int recSearch(E item, Node node){ 
    if (head == null){ 
     return -1; 
    }else if (node.data.equals(item)){ 
     return searchCnt; 
    }else{ 
     searchCnt++; 
     return recSearch(item, node.next); 
    } 
} 

我覺得它應該被正確地計算,因爲它會在每次它不符合if和else if條件的時間來算,但我不能在正確的地方增加?或者我完全離開?謝謝您的幫助!

+1

'searchCnt'在哪裏定義? – Madbreaks

+0

@Madbreaks它被定義爲一個類變量 – Talaria

回答

2

你只需要調用recSearch()之前設置searchCnt 0內部search()。此外,您需要測試node == null而不是head == null

或者,你可以改爲嘗試這個辦法:

public int search(E item) { 
    return recSearch(item, head, 0); 
} 

public int recSearch(E item, Node node, int index){ 
    if (node == null){ 
     return -1; 
    }else if (node.data.equals(item)){ 
     return index; 
    }else{ 
     return recSearch(item, node.next, index + 1); 
    } 
} 

它消除了對類/實例變量的需求。

請注意,這不允許在節點上使用null數據。爲了支持null值,你就需要另一個if/else分支在檢查node == null之後:

}else if (item == null && node.data == null) { 
    return index; 
} 
+0

這使得總體感。謝謝,我的朋友! – Talaria

1

您將要進行遞歸以便它能夠正確地更新時通過您searchCnt變種。

public int search(E item) { 
    return recSearch(item, head, 1); 
} 

public int recSearch(E item, Node node, int searchCnt){ 
    if (head == null){ 
     return -1; 
    }else if (node.data.equals(item)){ 
     return searchCnt; 
    }else{ 
     return recSearch(item, node.next, ++searchCnt); 
    } 
} 

在初始呼叫的1假設,如果你在recSearch第一次迭代,則計爲一個搜索找到你的項目(和search會在這種情況下返回1)。