Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 需要更好地理解此代码_Javascript_Html_Css_Math_Recursion - Fatal编程技术网

Javascript 需要更好地理解此代码

Javascript 需要更好地理解此代码,javascript,html,css,math,recursion,Javascript,Html,Css,Math,Recursion,我正在读一本JavaScript的书,我对这方面还不太熟悉,所以我谈到了递归部分,我了解了递归是如何工作的,但这部分对我来说并不难,而是数学部分 代码如下: function isEven(n) { if (n == 0) return true; else if (n == 1) return false; else if (n < 0) return isEven(-n); else

我正在读一本JavaScript的书,我对这方面还不太熟悉,所以我谈到了递归部分,我了解了递归是如何工作的,但这部分对我来说并不难,而是数学部分

代码如下:

function isEven(n) {
     if (n == 0)
         return true;
     else if (n == 1)
         return false;
     else if (n < 0)
         return isEven(-n);
     else
         return isEven(n - 2);

}

这给了我真实的。。。为什么50==0为真或75==1为假。。。我真的不明白

当您将
50
传递到此函数时,它将转到最后一个块(
else
),并递归执行。当您写入
时,返回isEven(n-2)
,执行
isEven(48)
,然后下次执行
isEven(46)
,依此类推,直到到达
isEven(0)


这将调用第一个
if
块,并将
true
作为输出。
true
isEven(0)
返回,然后是
isEven(2)
(因为当执行
isEven(2)
时,您将转到
return isEven(0)
),这会使堆栈冒泡,最终返回
isEven(50)的输出
作为
true

当您将
50
传递给此函数时,它将转到最后一个块(
else
),并递归执行。当您写入
时,返回isEven(n-2)
,执行
isEven(48)
,然后下次执行
isEven(46)
,依此类推,直到到达
isEven(0)


这将调用第一个
if
块,并将
true
作为输出。
true
isEven(0)
返回,然后是
isEven(2)
(因为当执行
isEven(2)
时,您将转到
return isEven(0)
),这会使堆栈冒泡,最终返回
isEven(50)的输出
as
true

此代码是检查数字是否为偶数的一种很长的方法。它依赖于这样一个事实:如果一个数字是偶数,你不断地从中减去2,你最终会达到0。否则,如果您的数字是奇数,则重复减去2最终将达到1

因此,如果您传递的数字大于0,它将再次将下一个数字(n-2)发送回函数,直到它达到0或1为止。然后我们停下来


如果数字是负数,我们只需翻转符号并执行相同的过程。

这段代码在检查数字是否为偶数方面有很大的帮助。它依赖于这样一个事实:如果一个数字是偶数,你不断地从中减去2,你最终会达到0。否则,如果您的数字是奇数,则重复减去2最终将达到1

因此,如果您传递的数字大于0,它将再次将下一个数字(n-2)发送回函数,直到它达到0或1为止。然后我们停下来


如果数字为负数,我们只需翻转符号,然后执行相同的过程。

这是一种将递归应用于问题的有趣方法,可以简单地解决如下问题:

return n % 2 == 0
基本上,它通过两种基本情况来工作:
n==0
n==1
。这两者都是“已知的”,所以它们只返回true或false。如果数字为负数,则执行符号反转的递归调用(
isEven(-n)
)。否则,只需减去2(
isEven(n-2)
)。这是因为任何奇数减去2仍然是奇数,偶数减去2仍然是偶数。因此,只需从
n
中减去2,直到
n
符合一个基本情况(
n==0
n==1

if(n==0)//基本情况
返回true;
else如果(n==1)//基本情况
返回false;
如果(n<0)//反向符号,则递归调用
返回isEven(-n);
else//default,减去2,递归调用
返回isEven(n-2);

这是一种将递归应用于问题的有趣方法,可以简单地解决如下问题:

return n % 2 == 0
基本上,它通过两种基本情况来工作:
n==0
n==1
。这两者都是“已知的”,所以它们只返回true或false。如果数字为负数,则执行符号反转的递归调用(
isEven(-n)
)。否则,只需减去2(
isEven(n-2)
)。这是因为任何奇数减去2仍然是奇数,偶数减去2仍然是偶数。因此,只需从
n
中减去2,直到
n
符合一个基本情况(
n==0
n==1

if(n==0)//基本情况
返回true;
else如果(n==1)//基本情况
返回false;
如果(n<0)//反向符号,则递归调用
返回isEven(-n);
else//default,减去2,递归调用
返回isEven(n-2);

您可以使用
%
运算符简化函数

let isEven = n => !(n % 2);

您可以使用
%
运算符简化函数

let isEven = n => !(n % 2);
用这个来可视化你的代码,你就会看到你挂断的地方

加载页面后,单击“前进”按钮,逐步浏览代码。

使用此按钮可以可视化代码,您将看到挂起的位置


加载页面后,单击“前进”按钮,逐步浏览代码。

是否尝试跟踪代码?该键是函数的最后一行
50==0
显然不是
true
,因此当
n
50
时,它会一直到最后一行。使用递归来解决问题,即使没有。这似乎也不是一个好的选择。@guest271314的可能副本所有递归函数都有一个基本情况,即它们在不递归的情况下执行某些操作。否则你永远不会得到最终结果。你试过跟踪代码吗?键是函数的最后一行
50==0
显然不是
true
,因此当
n
50
时,它会一直到最后一行。使用递归来解决任何问题