我的递归方法调用有什么问题?

时间:2011-01-13 14:30:44

标签: coldfusion recursion

我有一个执行存储过程并返回结果的搜索功能。如果没有结果,我想尝试使用更通用的搜索再次运行该函数。所以,我在我的代码中添加了一个cfif -

<cfif results.recordCount EQ 0 And Not arguments.searchForPotentialMatches>
   <cfset arguments.searchForPotentialMatches = True />
   <cfinvoke method="thisMethod" argumentCollection="#arguments#" />
</cfif>

基本上,如果没有结果并且我还没有尝试过通用搜索,它应该再次调用此方法。然后,在方法的开头,在调用存储过程之前,我检查searchForPotentialMatches是否为true,如果是,我概括了搜索查询。

似乎有一个问题,但是......当我尝试运行它时,它会挂起 - 直到存储过程超时。通过调试和输出变量,我已经能够看到它到达存储过程,然后卡住尝试执行它。但是,在重新运行这些重新运行之前使用原始函数,如果我进行常规搜索,然后在2个单独的调用中进行通用搜索,则会正确执行。所以当我尝试以编程方式构建它时,我不确定它为什么会失败...我做错了什么?

4 个答案:

答案 0 :(得分:2)

真的可以是任何数量的东西。所有这些代码都在cfc中吗?那个cfc是否处于持久范围内并且你是否正确地改变了所有变量?

你可以单独执行普通和通用条件下的存储过程而不会出现问题吗?

尝试粘贴更多代码(包括第一次调用存储过程),这样我们就可以尝试更多地跟踪数据流。

答案 1 :(得分:1)

递归是:

  • 理论上诱人的简单和实践中的痛苦 - 调试。
  • 经常需要走树或遍历图表,但是当一个人可以不用时,不要做。

所以当你写的时候,我会丢失递归,并按顺序执行。如果没有@scrittler要求的更多代码,我会重写:

<cfcomponent output="false">
    <cffunction name="search" output="false" access="public" returntype="any" hint="I am called by the client">
        <!--- <cfargument/> tags --->
        <!--- what ever you need to do with the arg before actually searching --->
        <cfset var results = doSearch(argumentCollection=arguments)>
        <cfif NOT results.recordcount>
            <!--- whatever you need to change about the args to perform a generalized search --->
            <cfset var results = doSearch(argumentCollection=arguments)>
        </cfif>

        <cfreturn results>
    </cffunction>

    <cffunction name="doSearch" output="false" access="private" returntype="query" hint="I run the query">
        <!--- <cfargument/> tags --->
        <!--- results query (i.e. call to sproc)--->
        <cfreturn results>
    </cffunction>
</cfcomponent>

答案 2 :(得分:0)

你在函数标签上的访问属性是什么,你给它一个让函数无法调用自身的值吗?

答案 3 :(得分:0)

这感觉不公平......但问题在于完全不同的东西。递归调用正常工作,但是有另一个字段由于在调用存储过程之前检查函数并导致存储过程挂起而发生更改。对此感到抱歉,感谢您的帮助!