2017-09-13 129 views
-1

對於我的遞歸考試,我必須編寫一個遞歸函數來遍歷鏈表,並刪除所有不包含某些數據的節點,並計算在C++中刪除的節點數。我不允許使用靜態函數,靜態局部變量或全局變量。我該怎麼做呢?遞歸計算遞歸函數中發生的循環數,而不使用靜態局部變量,全局變量或靜態函數?

具體使用的函數是:INT remove_except(節點* &頭,節點* &尾),並且它的直線鏈表上使用。我無法找到任何方法來計算刪除的節點數量,而不使用上面列出的三種方法之一。

+0

免費的線索:請問這是由一個呼叫者稱爲函數會返回* *的值到主叫方,像是某種計數器,或什麼的? –

+0

這裏沒有代碼,只是一個方法簽名。我們應該從中看出什麼?我也很困惑你爲什麼傳遞指針的引用。 – tadman

+0

@SamVarshavchik我想你應該說我應該返回一些名爲counter的整數,並在每次循環發生時遞增?但我不知道如何在不改變函數原型的情況下在遞歸函數中執行此操作,或者創建一個靜態變量或全局變量,這兩者我都不允許這樣做。 –

回答

1

由於您不能使用變量或參數,因此只會留下一個選項 - 使用函數的返回值

對於遞歸函數的每次調用,執行下列操作:

  • 如果輸入節點位於列表的末尾,則返回0。

  • 否則,如果所述輸入節點是移除,返回1 +下一個調用的返回值(使用下一個節點作爲輸入)。

  • 否則,按原樣返回下一個調用的返回值(使用下一個節點作爲輸入)。

當所有的調用都完成後,1會加起來,因爲控制器會將調用堆棧備份到原始調用方。

例如:

int remove_except(node * & head, node * & tail) 
{ 
    if (!head) return 0; 
    node *next = head->next; 
    if (... /* head is to be removed */) 
    { 
     removeNode(head, tail); 
     return 1 + remove_except(next, tail); 
    } 
    return remove_except(next, tail); 
}