Javascript ..在本教程中完全丢失了

时间:2011-02-22 06:35:57

标签: javascript

我的入门教程突然变得非常先进。我不知道这个程序是如何工作的。你能用简单的语言解释一下吗?

最后它打印(((1 * 3)+ 5)* 3),但我根本没有得到它。据我所知,findSequence传递了24,触发函数find。我假设函数find被传递1,“1”,后者被分配给历史?但是我不明白为什么第二个1用引号“1!”,当它返回find时,我也不理解使用引号(开始等等。

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));

2 个答案:

答案 0 :(得分:4)

您有一个“输出”字符串(((1 * 3) + 5) * 3),一个目标24和一个第一个字符111 * 3中的1。该程序将汇编一个包含数学表达式的字符串,添加(),* 3和+5以尝试获取目标。 find函数的两个参数是当前总数和将生成总计的表达式。显然,表达式是一个字符串。该查找将当前总数与目标进行比较,如果它相等则表达式是正确的并且如果当前总数> 1,则返回该表达式。然后他失败并返回null。另外,他在表达式中添加了一些操作。他尝试了两种“方式”,一种是将当前结果乘以* 3,另一种是将+5加到当前结果中。它在树上是递归的(因此每次他将在两个递归调用中分叉)。 null ||某事==某事,所以发现响应的分支将返回他的响应,另一分支将返回null并且“获胜”响应将被传回。

让我们说目标是11。

  • 找到(1,“1”)
    1. 将1与11进行比较并调用:(2。)find(1 + 5,“(”+“1”+“+ 5)”)(所以找到(6,“(1 + 5)”)和( 3.)找到(1 * 3,“(”+“1”+“* 3)”)(所以找(3,“(1 * 3)”)
    2. 将6与11进行比较并调用(4.)find(6 + 5,“(”+“(1 + 5)”+“+ 5)”)(所以找到(11,“((1 + 5) + 5)“)和(5。)找到(6 * 3,”(“+”(1 + 5)“+”* 3)“(所以找到(18,”((1 + 5)* 3)“
    3. 将3与11进行比较并调用(6.)find(3 + 5,“(”+“(1 * 3)”+“+ 5)”)(因此找到(8,“((1 * 3) + 5)“)和(7.)找到(3 * 3,”(“+”(1 * 3)“+”* 3)“(所以找(8,”((1 + 3)* 3)“
    4. 将11与11进行比较。数字相等。所以他返回“((1 + 5)+ 5)”(历史)。 5,6,7将在某一点“落水”并超过11,所以他们将返回null。 null || null == null,“((1 + 5)+ 5)”|| null ==“((1 + 5)+ 5)”,所以历史记录将赢得空值并将返回。

为了更清楚,请尝试以下版本:

function findSequence(goal) {
  function find(start, history) {
    if (start == goal)
      return history;
    else if (start > goal)
      return null;
    else {
      var ret = find(start + 5, "(" + history + " + 5)");

      if (ret == null)
         ret = find(start * 3, "(" + history + " * 3)");

      return ret;
    }
  }

  return find(1, "1");
}

print(findSequence(24));

而且,在这里,你只能得到+和*

而不是表达式
function findSequence(goal) {
  function find(start, history) {
    if (start == goal)
      return history;
    else if (start > goal)
      return null;
    else {
      var ret = find(start + 5, history + "+");

      if (ret == null)
         ret = find(start * 3, history + "*");

      return ret;
     }
  }

  return find(1, "1");
}

print(findSequence(24));

请注意,作为一个例子,它非常复杂,因为它使用了闭包(本地定义的函数)。

答案 1 :(得分:0)

试用本教程

http://nicksjavascript.blogspot.com

为初学者制作