繁体   English   中英

我如何向第三方解释最后一行

[英]How do i explain the last line to a third party

关于这段代码,我发现很难向第三方解释。 当递归调用我们的函数时,从 n 中减去 2 背后的逻辑是什么?

function is_even(n) {
    if (n<0) {
        return Math.abs(n) 
    }
    if (n=== 0) {
        return true;
    } else if (n === 1) {
        return false;
    } else {
        return is_even(num - 2);
    }
}

console.log(is_even(8));

所以这里的逻辑是,你基本上可以通过从中减去 2 直到它是 0 或 1 来判断某个东西是奇数还是偶数。

你减去 2,因为如果你再减去任何东西,你可能会超调并最终得到一个负数。 通过减去 2,无论您从什么数字开始,您总是会得到 1 或 0。

如果你从 9 点开始

is_even(9)
9 - 2 = 7 | is_even(7)
7 - 2 = 5 | is_even(5)
5 - 2 = 3 | is_even(3)
3 - 2 = 1  => 1 indicates it is odd and the function will return

也许写出一些像上面这样的例子是向第三方解释的好方法。

我认为您的 is_even 函数需要进行一些调整才能按预期工作:

function is_even(n) {
    if (n < 0) {
        n = Math.abs(n)

    } if (n === 0) {
        return true;

    } else if (n === 1) {
        return false;
    }
    else {
        return is_even(n - 2);
    }
}

该函数只检查两件事,如果是 0 则返回 True,如果是 1 则返回 False。

如果您是大于 0 或 1 的任何值,例如 2,3,4,5,6,7,8,...

else 语句的递归性质意味着:您始终可以将任何正数减去 2 次足够的次数,使其变为 0 或 1。

这与将任何数字除以 2 的逻辑相同,余数总是 0 或 1,如果是 0,则该数字是偶数,如果是 1,则该数字是奇数。

你一直减 2 直到 n 是 1 或 0。如果它是 0,它是偶数,如果它是 1,它是奇数。 通过减去 2,您几乎可以找到 n / 2 的余数。

function is_even(n) {
    if(n<0){
        return Math.abs(n) 
    } 
    if (n=== 0) {
        return true;
    }
    else if (n === 1) {
        return false;
    }
    else {
        return is_even(n - 2);
    }
}


console.log(is_even(8));

首先,该行应该是:

return is_even(n - 2);

代替

return is_even(num - 2);

来解释一下:

给定一个数 n,该函数不断从该数中减去 2,直到余数为负数、0 或 1。如果该数为奇数,则在随后减去 2 时将返回 1。如果是偶数,则余数将为 0。如果数字小于 2,则余数将为负。 再次调用该函数的要点是继续以递归方式减去 2,直到最终值为 0,1 或负数。

当传递负值时,它返回绝对值而不是确定奇数或偶数。

  • 在第一次迭代 -> n = 8 中,再次调用函数。
  • 在下一次迭代中 -> n = 6 即 (8-2),再次调用函数。
  • 在下一次迭代中 -> n = 4 即(6-2),再次调用函数。
  • 在下一次迭代中 -> n = 2 即(4-2),再次调用函数。
  • 在下一次迭代中 -> n = 0 即 (2-2),函数停止并返回 true。

is_num 是一个递归函数,一个在执行过程中调用自身的函数。 现在当你写“return is_even(num - 2);” 那么您发送的参数比原始值 num 小 2 个单位。 return is_even(num - 2);... is_even 将再次被调用,但参数 n 的值将小 2 个单位。

n 的值将继续减少并且递归将继续进行,直到返回某些内容,并且该返回值将在首先调用它的行中接收。

有关更多信息,您可以参考此链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM