2016-11-11 7 views
1

私は雹のためにこの機能を得ようとしていますが、私はそれを1行ですべて印刷するように見えます。Javascript Hailstone 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文はinputed値を返すので、どんなnがもともとあり、かつ1ので、同様:

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

がどのように私は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はシーケンス全体を1行に出力したいが、これは解決しない。 – 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を何度も書き直してそれらを一緒に戻していました。

関連する問題