【问题标题】:Trying to make a function that prints an array range. I'm given the start, stop and step values. I keep getting an infinite loop试图制作一个打印数组范围的函数。我得到了开始、停止和步进值。我一直在无限循环
【发布时间】:2022-01-12 20:14:08
【问题描述】:

我正在尝试编写一个函数,该函数返回从“开始”值(包括)到“停止”值(不包括)的整数列表,并给出“步长”(或要递增的数字... )。

该函数应该能够处理传入的不同数量的参数。我相信我已经完成了大部分的函数,但我似乎得到了一个无限循环并且不确定为什么或如何继续。

这是我目前写的代码...

function range(start, stop, step) {
    if (arguments.length===1) {
        start = 0;
        stop = arguments[0];
        step = 1;
    } else if (arguments.length===2) {
        start = arguments[0];
        stop = arguments[1];
        step = 1;
    } else if (arguments.length===3) {
        start = arguments[0];
        stop = arguments[1];
        step = arguments[2];
    }
    // define result array
    let result = [];
    // create a for-loop
    for (start; start < stop; start + step) {
        result.push(start);
    }
    return result;
}

这里有一些示例调用及其预期输出...

range(10); -> [0,1,2,3,4,5,6,7,8,9]
range(1,11); -> [1,2,3,4,5,6,7,8,9,10]
range(0,30,5); -> [0,5,10,15,20,25]
range(0,-10,-1); -> [0,-1,-2,-3,-4,-5,-6,-7,-8,-9]

该函数还应该能够使用负“步长”值进行负范围。

有人可以向我解释为什么我似乎陷入了无限循环吗?

【问题讨论】:

  • start + step -> start += step
  • 一个for循环由三个表达式和一个主体组成:表达式(按顺序)是initializationtest和更新。 update 步骤应该更新 test 步骤正在使用的内容,以确定循环是否应该继续进行。 start + step更新 任何东西,它只是进行计算并丢弃结果。正如@VLAZ 所说,您想更新 start: start += step
  • 感谢两位的帮助!

标签: javascript arrays for-loop arguments range


【解决方案1】:

因为您没有更改 for 循环中的起始值。你错过了=

for (start; start < stop; start += step) 

【讨论】:

  • 感谢您花时间浏览和解释!我显然需要雪橇!
【解决方案2】:

您的代码包含几个错误。例如,您将值重新分配给参数,这是永远不应该做的。然后你的 for 循环只适用于大于开始的停止。而且根本没有错误检查。这是一个应该可以工作的不言自明的版本:

function range(start, stop, step) {
  for (let i = 0; i < arguments.length; i++) {
    if (!Number.isInteger(arguments[i])) {
      return [ 'Invalid arguments: all arguments must be of type Integer' ]
    }
  }
  let from = 0
  let to = 0
  let increment = 1
  if (arguments.length === 1) {
    to = arguments[0]
  } else if (arguments.length === 2) {
    [ from, to ] = arguments
  } else if (arguments.length === 3) {
    [ from, to, increment ] = arguments
  } else {
    return [ 'Invalid arguments: 0 or more than 3 arguments' ]
  }
  if (increment > 0 && from > to) {
    return [ 'Invalid arguments: step must be negative' ]
  } else if (increment < 0 && from < to) {
    return [ 'Invalid arguments: step must be positive' ]
  } else if (increment === 0) {
    return [ 'Invalid arguments: step cannot be 0' ]
  }
  let result = []
  if (increment > 0) {
    for (from; from < to; from += increment) {
      result.push(from)
    }
  } else {
    for (from; from > to; from += increment) {
      result.push(from)
    }
  }
  return result
}

console.log(range(10))             // [0,1,2,3,4,5,6,7,8,9]
console.log(range(1, 11))          // [1,2,3,4,5,6,7,8,9,10]
console.log(range(0, 30, 5))       // [0,5,10,15,20,25]
console.log(range(0, -10, -1))     // [0,-1,-2,-3,-4,-5,-6,-7,-8,-9]
console.log(range('0', 'abc'))     // Invalid arguments: all arguments must be of type Integer
console.log(range())               // Invalid arguments: 0 or more than 3 arguments
console.log(range(0, -10, 1))      // Invalid arguments: step must be negative
console.log(range(-20, -10, -1))   // Invalid arguments: step must be positive
console.log(range(0, 10, 0))       // Invalid arguments: step cannot be 0

【讨论】:

    【解决方案3】:

    另一种范围解决方案:

    const range = (start, stop, step) => {
      // manipulation with arguments
      const itemsCout = Math.ceil((stop - start) / step)
      return [...Array(itemsCout)].map((_value, index) => index*step+start )
    };
    
    console.log(range(1,10,2)); // [ 1, 3, 5, 7, 9 ]
    console.log(range(0,30,5)); // [ 0, 5, 10, 15, 20, 25 ]
    console.log(range(0,-10,-1)); // [ 0,-1,-2,-3,-4,-5,-6,-7,-8,-9 ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 2013-03-19
      • 2020-02-22
      • 2011-02-16
      相关资源
      最近更新 更多