当前位置:  开发笔记 > 编程语言 > 正文

JavaScript中递归和执行流程的更清晰的解释?

如何解决《JavaScript中递归和执行流程的更清晰的解释?》经验,为你挑选了1个好方法。

我正在阅读Eloquent JavaScript,我遇到了这个难题的例子:

考虑这个难题:从数字1开始并重复加5或乘以3,可以产生无限量的新数字.你会如何编写一个函数,给定一个数字,试图找到一个产生该数字的加法和乘法序列?

这是解决方案的代码:

function findSequence(goal) {
  function find(start, history) {
    if (start == goal)
      return history;
    else if (start > goal)
      return null;
    else
      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");
  }
  return find(1, "1");
}

print(findSequence(24));

如果没有参数start和goal的值,有人可以清楚dod find如何执行?递归是怎么发生的?



1> Rob Kennedy..:

find 并没有获得而不值执行startgoal.这是第一次用值来执行1start,并为唯一的价值goal24.

也许你对操作的顺序感到困惑.在那里我们看到了一个函数的声明,findSequence.在声明期间,不执行任何代码.该findSequence函数仅在最后一行执行,执行函数的结果打印出来.

在声明中findSequence,有另一个函数的声明,find.再一次,直到后来它才会被执行.该findSequence函数只有一个可执行的代码行,即调用的代码行find(1, "1").执行该一行会find递归地触发执行若干次.该find功能参考goal; 当Javascript解释器执行代码时,goal总是引用参数findSequence,并且因为在这个例子findSequence中只调用一次,所以goal总是具有相同的值,24.

您应该能够看到递归发生的位置.如果start等于goal,则函数停止; 它返回它到达该数字的历史.如果start大于goal,则返回null,表示该路径不是目标号的路径.如果start仍然小于goal,则该函数尝试使用其起始值加5 来调用自身.如果返回非空值,那么返回的是.否则,它会尝试乘以3并返回该历史值.

请注意,虽然此代码可以返回许多数字,但它不能返回所有数字.2例如,如果目标是findSequence返回,null因为无法通过添加或乘以来开始1并获得.253

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有