动态改变循环的方向

alter the direction of loop dynamically

本文关键字:方向 循环 改变 动态      更新时间:2023-09-26

我正试图想出一个算法在两个整数之间的"接近"行为。基本上,给定两个整数,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)。有人知道如何动态地改变循环的方向吗?

我认为如果你只使用while循环,它会更清楚地阅读:

'use strict';
let a = 12, b = 6;
let i = a;
while (i !== b) {
  console.log(i);
  i += a < b ? 1 : -1;
}

我甚至放弃了可爱的三进制,因为现在人们似乎如此反对if语句。

浏览器冻结,因为您没有更改正确的i。您只是在操作approachDir函数中的i。如果你退货&设置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
}

似乎你把一些并不那么困难的事情复杂化了。你可以将步骤设置为正或负。例如

var a = 20;
var b = 5;
for (var step = a > b ? -1 : +1; a != b; a += step)
{
     console.log(a);
}

问题在approachDiri++i--分别为post-increment和post-递减。这意味着它们在返回其原始值之后更新变量。所以函数返回的是原始值,而不是更新后的值。要在返回之前更新变量,应该使用++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)) {
    ...
}

在编写代码时,您假定变量是通过引用传递的,而不是通过值传递的,因此函数中的增量将修改调用者的变量。

一个选项是根据a>bapproachDir更改为返回正数或负数。中间的语句可以包含一个||,并且可以任意使用。

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);
}

我对@mathletics的答案做了一点改动:

  function loopDynamic(from, to) {
    const direction = from < to ? 1 : -1;
    let i = from
    while (i!== to) {
      // do whatever with i
      i += direction;
    }
  }