动态改变循环的方向

时间:2015-07-29 20:11:57

标签: javascript loops

我正在尝试为两个整数之间的“接近”行为提出一种算法。基本上,给定两个整数ab,我希望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)。有谁知道如何动态改变循环的方向?

6 个答案:

答案 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)

问题出在approachDiri++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;
    }
  }