需要帮助理解这个递归函数教程

Need help understanding this recursive function tutorial

本文关键字:递归函数 教程 帮助 助理      更新时间:2023-09-26

我在教科书中遇到了这个递归函数的例子。我可以看到这个网站上有其他的线程问了一个关于Eloquent 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,而this比13大,因此this将返回null。所以find函数尝试将start乘以3而不是加5,返回到11…

Start = 11 * 3, History = "(1 + 5) + 5) * 3"

这个值也太高了,因此会返回null。函数在这里停止了,对吧??

当我对它进行测试时,每次发现递归调用自己时,控制台都会记录开始值,它继续调用自己,直到到达编号13。函数在33之后循环的起始值为:

18
3
8
13

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

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

示例代码中有语法错误。它应该看起来像这样:

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)