Javascript 需要了解此递归函数教程的帮助吗

Javascript 需要了解此递归函数教程的帮助吗,javascript,recursion,Javascript,Recursion,我在教科书中遇到了这个递归函数的例子。我可以看到,这个站点上还有其他一些线程,它们从有说服力的JavaScript中询问关于这个示例的问题,但是用户理解这个示例的困难在于不理解通常如何调用函数 function findSolution(target){ function find(start, history){ if(start == target) return history else if(start > target) return

我在教科书中遇到了这个递归函数的例子。我可以看到,这个站点上还有其他一些线程,它们从有说服力的JavaScript中询问关于这个示例的问题,但是用户理解这个示例的困难在于不理解通常如何调用函数

function findSolution(target){
  function find(start, history){
    if(start == target)
      return history
    else if(start > target)
      return null
    else 
      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)") 
    }
    return find(1, "1");
  }
您向findSolution函数提供一个目标编号,它执行内部函数find,该函数调用自身,直到找到一种方法,通过加5或乘以3来达到目标编号。假设我提供数字13作为要达到的目标。参数增量如下所示

Start = 1 + 5, History = "(1 + 5)"
Start = 6 + 5, History = "(1 + 5) + 5"
Start = 11 + 5, History = "(1 + 5) + 5) + 5"
Start变为16,并且大于13,因此将返回null。所以find函数尝试将start乘以3,而不是加5,返回到11

Start = 11 * 3, History = "(1 + 5) + 5) * 3"
这也太高,因此将返回null。当然函数就到此为止了,对吗

不过,当我测试它时,每次find递归调用自己时,控制台都会记录开始值,它会继续调用自己,直到达到数字13为止。33之后功能循环的起始值为:

18
3
8
13

但这怎么可能呢?函数不应该在达到16和33后返回false吗?

示例代码中存在语法错误。应该是这样的:

function findSolution(target){
    function find(start, history){
        if(start == target)
            return history
        else if(start > target)
            return null
        else 
            return (find(start + 5, "(" + history + " + 5)") ||
                    find(start * 3, "(" + history + " * 3)"))
    }
    return find(1, "1");
  }
(注意内部函数中最后一次返回的结构。)

当以13的输入运行更新的函数时,我在控制台中看到:

((1*3)+5)+5)


Console.log历史记录就在基本案例之前。这将有助于理解它是如何工作的

是的,但这并不能回答我的问题。我的困惑是,在start等于16之前,代码是如何运行的。这将导致find函数返回null,并尝试将start乘以3,生成值33,该值再次调用find以返回false。这意味着第三个条件块中的两个条件都将返回false。我对返回和布尔运算的理解告诉我函数应该停止执行。但正如我所展示的,而且你也意识到,它会继续自我调用,直到找到解决方案——但如何解决呢sIt还值得注意的是,无论是否添加括号,函数都可以工作。为了可读性,我添加了括号。你问“假设我提供数字13作为要达到的目标”-输出显示13是如何达到的OK,让我澄清一下。函数调用自身,直到参数start等于16。因为这比13高。第二种乘以3的方法应用于前一个起始值11。这就产生了33个。在这一点上,函数——据我所知——应该停止执行。相反,它又执行了4次。我不明白为什么会发生这种情况。@SerGaweyne在每一个深度上,如果加法不起作用,它会进行乘法,因此在33时,它会返回
null
到具有
start
=
6
的部分,并尝试从中进行乘法。如果这不起作用,它将返回到
1
,并尝试与之相乘,然后从那里进行加法,直到匹配为止。如果不是这样的话,它会再次倒退。。如果在
1=5
上没有解决方案
find
和回溯到
1*3
都将无法返回
null
,因为
null | | null/==>null
这个循环来自您调用函数的方式。使用逻辑OR“| |”触发两次,停止条件只能停止其中一个。最好的解决方案是重写测试:如果(start+5这个递归很疯狂。它是一种双重递归,其中第二个递归调用依赖于逻辑析取。它是模糊的和令人讨厌的。让它去吧。@ftor是的,我可能永远不会在我的任何工作中使用它。但是,让我烦恼的是,我没有弄明白到底发生了什么。有一位同事向我解释过它,我不知道倒立。