2015-08-20 66 views
1

我明白遞歸函數是什麼,但請考慮以下示例函數,用於獲取項目上的本地數據版本,根據本地存儲的緩存時間檢查是否有可用的在線新數據,如果存在,使用新版本更新本地數據,以任何方式返回有關它的最新數據。每個調用自身的函數應該被認爲是遞歸函數嗎?

function getItemData(id){ 
    var local=getLocalItemData(id); 
    if(!local.cacheTime.upToDate()){ 
     var newData=getOnlineItemData(id); 
     updateLocalItemData(id, newData); 
     return getItemData(id); 
    } 
    else{ 
     return local.returnHumanReadable(); 
    } 
} 

我反對認爲它遞歸函數的參數是事實,它只會落得一個自稱在極少數情況下,當緩存時間指示數據已經過期,並且該功能只調用自身的便利。

而不是使用return getLocalItemData(id).returnHumanReadable();我可以使用return getItemData(id);,因爲它會返回相同的結果,因爲新保存的數據不需要在幾微秒內再次刷新,它將需要該函數自行調用。另外,它要短得多:在實際的代碼中,我會使用低級命令而不是這些函數調用,導致代碼重複,從而導致整個函數難以讀取和維護。

那麼,你認爲我的論點有什麼意義,或者你認爲這只不過是代碼組織的問題?

回答

3

簡短的回答是:是的,它是遞歸

,如果你認爲不支持遞歸的平臺

因爲它可以調用本身,你的代碼將不會在該平臺上工作,它變得非常重要,因爲它在技​​術上是遞歸的

對於這樣一個微不足道的情況,用getLocalItemData(id).returnHumanReadable();代替遞歸調用將允許它在這個平臺上工作。事實上,你可以改變你的代碼:

function getItemData(id){ 
    var local=getLocalItemData(id); 
    if(!local.cacheTime.upToDate()){ 
     var newData=getOnlineItemData(id); 
     updateLocalItemData(id, newData); 
     local=getLocalItemData(id); 
    } 
    return local.returnHumanReadable(); 
} 

注:如果你不能說,只需要一個電話100%的保證,改變ifwhile

+0

其實,在我看來,該你提出的功能並不完全等同於OP的功能。如果你用'while'替換'if',你應該有一個真正的等價。 – Renzo

+0

@Renzo我可能會這樣編碼,但是OP聲稱它只能通過提供的替換髮生一次 –

+1

你是對的,但從某種意義上說,「遞歸性」是有問題的。我會嘗試更好地解釋自己:遞歸性應該從函數的正式轉換中更清楚。由於'updateLocalItemData'非常快,只需要訪問一次網絡,這一事實在這種情況下是正確的,但假設它將來需要更多時間,那麼可能需要再次調用'getOnlineItemData', *這是*遞歸的本質。不過,我瞭解你的觀點和你對這個功能的定義。 – Renzo