I'm在if语句中使用小于比较器;然而,即使它不应该;t、 它的评估结果为false
I'm using the less than comparator in an if statement; however, even when it shouldn't, it evaluates to false
所以,我正在做一个程序,它涉及到寻找两个数字的最大公约数。我有一个if语句,它被用作基本情况;但基本情况总是会触发,即使不应该触发。
代码如下:
function gcd(m, n)
{
if(m < 1 || n < 1)
{
return 55;
}
return gcd(n, m % n);
}
我在其中输入了55作为一些随机值,但即使当我启动Chrome或Firefox的控制台并输入gcd(20,5)时,它也会返回55。这两个数字显然都不少于一。我是JavaScript的新手,所以我可能缺少一些东西,但似乎一切都在那里。谢谢你的帮助。
函数是递归的,当它第一次运行时,因为m和n不小于1,它再次返回函数的值(这似乎一直持续到它返回55)
使用您在示例中提供的数字,在第一次运行后,会再次调用函数,但n以m%n的形式传入,在本例中为20%5,等于0。所以现在当它运行时,n小于1,所以它返回55
您显然不了解递归和停止标准。
正确的算法是
function gcd(m, n)
{
if (n == 0){
return m;
}
return gcd(n, m % n);
}
让我们来分解一下:
gcd(20.5)->gcd(5.0)
当您的算法调用gcd(5,0)时,由于n小于0,因此返回55。
所以,实际上,基本情况并不总是像你说的那样触发,它只在第二次呼叫时触发。正确的算法也会发生同样的情况,但正确的条件会带来正确的答案。由于n是0,它返回m,m是20和5的最大公约数。
正如@recursive在评论中指出的那样,这个解决方案已经考虑到了n>m的情况。当n>m时,gcd(m,n)的第一个返回是gcd(n,m)。
相关文章:
- 我想在AngularJS应用程序中创建一个输入数字框,用户不应该在该框上键入十进制数字.(一个整数输入框)
- Javascript代码添加了一些不应该存在的内容
- 有没有任何情况下,一个方法不应该是原型方法
- 当我认为它不应该重新渲染视图时,如何防止 Meteor 在 html 选择 dom 单击事件上重新渲染视图
- Node.js Promise - 代码不应该等到 .then 完成()
- 跳跃运动:旋转轴 – 如果手静止不动,它不应该在 0 左右
- 如果我不应该在组件WillUpdate中调用setState,如何更新状态(使用ReactJS)
- Javascript:尝试从多个没有匹配的数组中采样,在不应该的时候循环递增
- ng-attr数据切换简写:不显示false
- 这个正则表达式不应该工作吗?
- 为什么不应该't我在JavaScript中使用Alert
- 如何避免隐藏不应该隐藏的部分
- 在对javascript/NodeJS应用程序进行原型设计时,应该测试什么,不应该测试什么
- 如果我不应该用流星吗;不需要反应性
- jQuery点击监听器在'It’不应该
- JavaScript排序函数排序时不应该排序
- Javascript插件不应该影响所有的选择框
- Javascript闭包:这个数组不应该通过getArray进行编辑
- I'm在if语句中使用小于比较器;然而,即使它不应该;t、 它的评估结果为false
- 为什么这个函数有效?不应该在每次调用函数时“执行”都返回 false