Javascript 需要更好地理解此代码
我正在读一本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
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)的输出
astrue
此代码是检查数字是否为偶数的一种很长的方法。它依赖于这样一个事实:如果一个数字是偶数,你不断地从中减去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
时,它会一直到最后一行。使用递归来解决任何问题