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

时间:2016-10-11 09:28:05

标签: javascript recursion

我在教科书中遇到了这个递归函数的例子。我可以看到这个网站上有其他线程从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"

开始变为16,并且高于13,因此这将返回null。因此,find函数尝试将3开始乘以而不是添加5,返回11 ...

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

这也太高了,所以会返回null。当然这个功能在这里停了,对吧?

当我测试它时,控制台在每次查找递归调用自身时记录起始值,它继续调用自身,直到它达到13号。函数在33之后循环的起始值为:

18
3
8
13

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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)