我明白遞歸函數是什麼,但請考慮以下示例函數,用於獲取項目上的本地數據版本,根據本地存儲的緩存時間檢查是否有可用的在線新數據,如果存在,使用新版本更新本地數據,以任何方式返回有關它的最新數據。每個調用自身的函數應該被認爲是遞歸函數嗎?
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);
,因爲它會返回相同的結果,因爲新保存的數據不需要在幾微秒內再次刷新,它將需要該函數自行調用。另外,它要短得多:在實際的代碼中,我會使用低級命令而不是這些函數調用,導致代碼重複,從而導致整個函數難以讀取和維護。
那麼,你認爲我的論點有什麼意義,或者你認爲這只不過是代碼組織的問題?
其實,在我看來,該你提出的功能並不完全等同於OP的功能。如果你用'while'替換'if',你應該有一個真正的等價。 – Renzo
@Renzo我可能會這樣編碼,但是OP聲稱它只能通過提供的替換髮生一次 –
你是對的,但從某種意義上說,「遞歸性」是有問題的。我會嘗試更好地解釋自己:遞歸性應該從函數的正式轉換中更清楚。由於'updateLocalItemData'非常快,只需要訪問一次網絡,這一事實在這種情況下是正確的,但假設它將來需要更多時間,那麼可能需要再次調用'getOnlineItemData', *這是*遞歸的本質。不過,我瞭解你的觀點和你對這個功能的定義。 – Renzo