我正在尝试为两个整数之间的“接近”行为提出一种算法。基本上,给定两个整数a
和b
,我希望a
“接近”b
,即使b
小于a
。我认为这看起来的方式是交换循环增量函数:
for (var i = a; approachCond(i, a, b); approachDir(i,a, b)) {
// some fn(a, b);
}
,其中
approachCond(i, a, b) {
return a < b ? i < b : i > b;
}
和
approachDir(i, a, b) {
return a < b ? i++ : i--
}
但是,当我尝试这样做时,浏览器会冻结(Chrome)。有谁知道如何动态改变循环的方向?
答案 0 :(得分:2)
您的浏览器冻结是因为您没有更改正确的i
。您只是在操纵i
函数中的approachDir
。如果你归还它&amp;将for
范围i
设置为新值,它将起作用。
尝试:
for (var i = a; approachCond(i, a, b); i = approachDir(i,a, b)) {
// some fn(a, b);
}
approachDir(i, a, b) {
return a < b ? i + 1 : i - 1
}
答案 1 :(得分:2)
如果您只使用while
循环,我认为阅读更清晰:
'use strict';
let a = 12, b = 6;
let i = a;
while (i !== b) {
console.log(i);
i += a < b ? 1 : -1;
}
我甚至离开了可爱的三元组,因为这些天人们似乎如此反对if语句。
答案 2 :(得分:1)
问题出在approachDir
。 i++
和i--
发布 -increment,发布 -decrement。这意味着他们在>>之后更新变量返回其原始值。因此该函数返回原始值,而不是更新的值。要在返回之前更新变量,您应该使用++i
或--i
。
但是你根本不需要使用增量运算符,因为局部变量会立即消失。只需返回新值。
function approachDir(i, a, b) {
return a < b ? i + 1 : i - 1;
}
您还需要在循环中重新分配变量:
for (var i = a; approachCond(i, a, b); i = approachDir(i, a, b)) {
...
}
编写代码的方式,假设变量是通过引用而不是值传递的,因此函数中的增量将修改调用者的变量。
答案 3 :(得分:1)
似乎你过于复杂的事情并不那么难。您可以将步骤设置为正面或负面。 e.g。
var a = 20;
var b = 5;
for (var step = a > b ? -1 : +1; a != b; a += step)
{
console.log(a);
}
答案 4 :(得分:0)
一种选择是根据if approachDir
更改a>b
以返回正值或负值。中间语句可以包含||并以任何方式工作。
function approachDir(a, b){
return a>b?-1:1;
}
var a=3;
var b=1;
for (var i = a; i<b||i>b; i+=approachDir(a, b)) {
console.log(i);
}
a=1;
b=3;
for (var i = a; i<b||i>b; i+=approachDir(a, b)) {
console.log(i);
}
答案 5 :(得分:0)
我对@mathletics答案做了些微改动:
function loopDynamic(from, to) {
const direction = from < to ? 1 : -1;
let i = from
while (i!== to) {
// do whatever with i
i += direction;
}
}