【问题标题】:Where does this function gets its values?这个函数从哪里得到它的值?
【发布时间】:2016-06-26 20:15:11
【问题描述】:

这是书中的一个例子。如果是偶数,该函数返回 TRUE,否则返回 FALSE。我不明白它是如何工作的。这是我的理解:

  1. 42 绑定到 n
  2. 创建“偶数”函数
  3. x 绑定到 = 42 的 n
  4. x != 0
  5. 启动“其他”
  6. 创建“奇数”函数
  7. 奇数(42 - 1)
  8. 正在启动“!even(41)”。

JS 对 "even(41)" 做了什么? TRUE 从何而来?我理解它的方式应该只在 x === 0

时返回 TRUE

document.write(
  ((n) => {
    const even = (x) => {
      if (x === 0) return true;
      else {
        const odd = (y) => !even(y);
        return odd(x - 1);
      }
    }
    return even(n)
  })(42)
)

【问题讨论】:

  • 这是一个递归函数,x === 0 是基本情况。
  • 是的,尝试手动写下递归,就像他们在这里为阶乘所做的那样,例如 mitpress.mit.edu/sicp/full-text/sicp/book/node15.html
  • 这似乎是一种查找数字是偶数还是奇数的糟糕方法
  • @redu 绝对是这样。我认为它的目的是作为递归课程,这只是一个非常糟糕的课程。
  • 而这段“代码”中最可怕、最丑陋、最恶心的部分是(n-1) 次重新定义了odd 函数。

标签: javascript function inline-functions


【解决方案1】:

这是故意混淆的。遵循逻辑。

如果 n 不为 0,我们将创建一个名为奇数的新函数,它调用偶数并反转偶数的布尔值。

然后我们用 n-1 调用该函数

所以本质上,它就像一个 while 循环,你不断地从数字中减去 1,并在每一步更深地反转它的真假,直到你得到一个 0。如果函数被调用了偶数次,它就是偶数。如果它被称为奇数次,那就是奇数。

【讨论】:

  • 除了故意混淆之外,它也是检查偶数或奇数的一种非常低效的方法。我认为它是为了演示递归,但它甚至不是很擅长......
  • 同意,刚刚对 OP 做了同样的评论。
  • 我认为令人困惑的部分是 odd 是在 elseinside even 函数的范围内声明的 - 如果它们会更清楚处于同一水平。这是否真的是故意的值得质疑。
  • @Paul 但它怎么知道函数被调用了多少次?例如我们有(2)。奇数(2 - 1)不为零,并且不返回 TRUE。 TRUE 来自哪里?
  • 因为每次调用它的返回值都与下一个相反。它真的不需要知道多少次。如果它被调用一次,它会返回为 !true,所以 false。如果两次,它是!!真的,太真实了。三遍,!!!true,再次为false,依此类推。
【解决方案2】:

以下代码执行与本书示例相同的逻辑,包括使用递归,但如果使用非整数或负值调用 isEven,则会防止无限循环。

const isEven = (n) =>
{
    const even = (x) =>  x ? !even(x-1) : true;

    return even( Math.abs(Math.floor(n)));
}
isEven( 42)

现在基准逻辑测试相当简单:

even( 0) returns true;
even( 1) returns !even( 1-1), which is !even(0), which is false;
even( 2) returns !even( 2-1), which is !even(1), which is true;

以此类推以获得更大的数字。参数值的每个增量都会对 even 执行一个额外的递归调用,这会补充其下方数字的“偶数”,直到达到硬编码为偶数的零。

最终结果是如果even被调用奇数次(偶数)isEven返回true;如果even 被调用偶数次(对于奇数)isEven 返回 false。

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-07-23
    • 2012-07-04
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多