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

问题描述 投票:0回答:2

我的入门教程突然变得非常高级了。我不知道这个程序是如何工作的。你能用通俗的语言解释一下吗?

最后它打印了 (((1 * 3) + 5) * 3),但我根本不明白。 我知道 findSequence 传递了 24,这会触发函数 find。我假设函数 find 传递了 1,"1" ,后者被分配给历史记录?但我不明白为什么第二个1在引号“1!”中,也不明白返回find(start等时引号的使用。

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));
javascript recursion
2个回答
4
投票

您有一个“输出”字符串

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

假设目标是 11。

  • 查找(1, "1")
    1. 比较 1 和 11 并调用: (2.) find(1 + 5, "(" + "1" + " + 5)") (所以 find(6, "(1 + 5)") 和 (3.) ) find(1 * 3, "(" + "1" + " * 3)") (所以 find(3, "(1 * 3)")
    2. 比较 6 和 11 并调用 (4.) find (6 + 5, "(" + "(1 + 5)" + " + 5)") (所以找到(11, "((1 + 5) + 5 )") 和 (5.) find (6 * 3, "(" + "(1 + 5)" + " * 3)" (所以 find(18, "((1 + 5) * 3)"
    3. 将 3 与 11 进行比较并调用 (6.) find (3 + 5, "(" + "(1 * 3)" + " + 5)") (所以 find(8, "((1 * 3) + 5 )") 和 (7.) find (3 * 3, "(" + "(1 * 3)" + " * 3)" (所以 find(8, "((1 + 3) * 3)"
    4. 比较 11 和 11。数字相等。所以他返回“((1 + 5) + 5)”(历史)。 5、6、7 在某个时刻会“超出”并超过 11,因此它们将返回 null。空 || null == null, "((1 + 5) + 5)" || null == "((1 + 5) + 5)",因此历史记录将战胜 null 并返回。

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

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

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


0
投票

尝试一下这个教程

http://nicksjavascript.blogspot.com

专为初学者设计

© www.soinside.com 2019 - 2024. All rights reserved.