2016-11-11 155 views
1

所以我試圖讓冰雹的這個功能,但我似乎無法得到它打印所有在一行。下面是代碼:Javascript Hailstone序列

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語句,最後才能在一行返回整個序列?

回答

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

關鍵點是加入陣列的方法的使用。

+0

OP想要在一行上輸出整個序列,但這並不能解決。 – Valkyrie

+0

循環內的控制檯日誌用於調試。這很明顯。最後我的方法返回字符串。 – Daniel

+0

我的錯誤,對不起 – Valkyrie

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,然後將它們一起返回。