从小到大,再从大到小重复输出,有没有什么好的算法

题目描述

如何循环先正序输出,再倒序输出,
比如: 123321123321

题目来源及自己的思路

想到的办法是给定一个数组到3时候,反转一下

相关代码

arr=[3,2,1]

for(i=0;i<18;i++){
  if(i%3==0){
    arr.reverse()
  }
  console.log(arr[i%3])
}

你期待的结果是什么?实际看到的错误信息又是什么?

上面代码,看起来完美的做到了, 但是为什么还有来提问呢,因为具体应用中是需要一个函数

y=func(x)

x=1,y=1
x=2,y=2
x=3,y=3
x=4,y=3
x=5,y=2
x=6,y=1
这样的无限循环下去,不会写了,求助大家

阅读 2.2k
2 个回答

看来初中数学都有丢光了,

for(var i=1;i<=18;i++){
  console.log(func(i,3))
}

function func(num,n){
  var d = Math.ceil(num/n)-1
  
  return Math.abs(((num-n*d)-(n+1)*(d%2)))
}

https://jsbin.com/tomaxujiza/...

没注意审题,修改一下..本来挺好的办法,改成这样就觉得傻傻的了
一般这种操作,我建议使用generator实现,不用取余数的方法是为了避免后期数字太大导致难以预料的问题

function* gen(arr) {
    let array = arr.concat(arr.reverse())
    while (true) {
        for (let j=0;j<array.length;j++){
            yield array[j]
        }
    }
}

generator = gen([1,2,3])

while(true) {
    let value = generator.next().value
    console.log(value)//无限循环
}

性能什么的应该都OK

function* gen(arr) {
    let array = arr.concat(arr.reverse())
    for  (let x=1;true;x++) {
        for (let j=0;j<array.length;j++){
            yield {x:x,y:array[j]}
        }
    }
}

generator = gen([1,2,3])
for (let _=0;true;_++){
    console.log(generator.next().value)
}
推荐问题