每个自称的函数都应该被认为是一个递归函数吗?

时间:2015-08-20 17:51:45

标签: recursion semantics

我理解递归函数是什么,但请考虑以下函数示例,以获取项目的本地数据版本,检查是否有基于本地存储的缓存时间在线可用的新数据,如果有是,使用新版本更新本地数据,以任何方式返回有关它的最新数据。

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);,因为它会返回相同的结果,因为新保存的数据不需要在几微秒内再次刷新它将需要的功能自称。此外,它更短:在实际代码中,我将使用较低级别的命令而不是那些函数调用,导致代码重复,这将使整个函数更难以读取和维护。

那么,你认为我的论点是否有意义,或者你认为这仅仅是代码组织的问题?

1 个答案:

答案 0 :(得分: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%保证只需要一次通话,请将if更改为while