Javascript Hailstone序列

时间:2016-11-11 22:52:23

标签: javascript while-loop sequence

所以我试图将这个功能用于冰雹,但我似乎无法将它打印在一条线上。下面是代码:

var hailStoneSeq = function(n){
   var seq = n + " "

    while(n != 1)
   {
       if(n % 2 == 0)
       {
          n = n / 2
          console.log(n)
          var newSeq = n
       }    
       else
       {    
          n = ((n * 3) + 1)
          console.log(n)
          newSeq =  n
        }

   }

   return seq + newSeq  
  }

现在,当我运行它时,console.log工作,它显示整个序列。但是return语句只返回输入的值,所以无论n最初是什么,和1.就像这样:

 hailStoneSeq(5)
 16 
 8
 4
 2
 1
 "5 1"

如何在结尾处获取return语句以将整个序列返回到一行?

3 个答案:

答案 0 :(得分:1)

删除console.log(n)行并在函数返回之前输出一个数组。此外,您不需要newSeq变量,只需使用n

编辑:误解了问题,代码已修复

function hailStoneSeq(n){
    var seq=[n]

    while(n!=1){
        if(n%2==0) n/=2
        else n=(n*3)+1

        seq.push(n)
    }

    return seq.join(' ')
}

console.log(hailStoneSeq(5))

答案 1 :(得分:0)

我略微更改了代码,删除了未使用的变量和代码重复:

var hailStoneSeq = function(n){
    var arr = [];
    arr.push(n);
    while(n != 1)
    {
        n =n % 2 ? ((n * 3) + 1) : n / 2;
        console.log(n)
        arr.push(n);
    }
    return arr.join(" ")
};

console.log(hailStoneSeq(5));

关键是使用数组的连接方法。

答案 2 :(得分:0)

它应该是这样的:

function hailStoneSeq(n){
    var seq = n;

    while(n != 1){
        if(n % 2 == 0){
            n = (n / 2);
        }else{
            n = ((n * 3) + 1);
        }

        seq += (" " + n);
    }

    return seq;
}

console.log(hailStoneSeq(5));

基本上,你需要循环内的seq = seq + ...(或seq += ...)来存储每次迭代的进度。

在您的代码中,您存储了原始seq并重复了newSeq = n,然后将这些内容重新组合在一起。