[英]Return the number of elements in a linked list recursively
我在其中傳遞的頭一類叫做ImageNode以下遞歸方法-從一類稱為圖像( 此鏈接列表的開始)。 我以為我的代碼將遞歸地遍歷每個節點,然后增加計數,直到最后返回計數,不幸的是沒有。 我要去哪里錯了?
private int countRec() {
int count = 1;
ImageNode node = this;
if (node.next != null ){
node = node.next;
count++;
countRec();
}
return count;
}
您將忽略countRec()
的結果-您將在遞歸調用中進行迭代 ,從而countRec()
了目標。 (您還對同一對象進行了遞歸調用,沒有參數且狀態沒有改變,因此這樣做無濟於事。)我的遞歸方法將基於以下設計:
所以:
private int countRec() {
return next == null ? 1 : 1 + next.countRec();
}
現在,這當然不允許使用長度為0的列表了……您可能想將列表的概念與節點分開,在這種情況下,列表類將具有以下內容:
public int count() {
return head == null ? 0 : head.countRec();
}
其中的值head
是頭節點的參考,如果有一個,或null
否則。
當然,這在時間和空間上將是O(n)。 您可以使用迭代而不是遞歸來獲得O(1)空間,只需將列表的大小保留為列表中的實例變量即可獲得O(1)時間,並在需要時進行更新。 我希望這個問題是基於教育要求而不是真實的代碼-在生產代碼中,您將只使用已經提供的集合。
遞歸函數的定義是根據自身定義的:即,如果列表為空,則列表中的元素數等於0;否則為0。 否則等於1 + 列表中其余元素的計數 。
上面定義的斜體部分是調用函數的地方。
private int countRec(ImageNode node) {
if (node == null) {
return 0;
} else {
return 1 + countRec(node);
}
}
當遞歸函數使用進一步調用的結果來解決他的問題時(例如數學上的歸納步驟),它很有用。 您的函數沒有使用countRec()
調用的返回值來進行任何操作,並且您仍在嘗試在沒有遞歸幫助的情況下解決問題。 您可以使用它來解決它,如下所示:
if(node.next != null)
{
node = node.next;
count = countRec()+1;
}
return count;
當然,由於我們要講的是使您的代碼更好,因此您甚至不需要使用此node
var,只需執行以下操作:
private int countRec() {
if (this.next != null )
return (this.next.countRec())+1;
return 1;
}
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.