2016-09-24 7 views
1

私はRubyを学ぶためにいくつかのオンライン実践上の問題を抱えていますが、私はこの問題を解決することができましたが、変数宣言の配置について理解していません。Ruby(初心者)の変数宣言の配置

idx2 while-loop内で "pair"(配列インデックスの合計)を宣言/定義すると、次のコードが機能するのはなぜですか?ただし、インデックス自体を宣言した直後にはできません。

def two_sum(nums) 
    idx=0 
    idx2=0 
    while idx<nums.length-1 
    idx2=idx+1 
    while idx2<nums.length 
     pair=nums[idx]+nums[idx2] 
     if pair==0 
     return [idx, idx2] 
     else 
     idx2+=1 
     end 
    end 
    idx+=1 
    end 
end 

上記のバージョンは機能しますが、以下の構造は機能しません。

def two_sum(nums) 
    idx=0 
    idx2=0 
    pair=nums[idx]+nums[idx2] 
    while idx<nums.length-1 
    idx2=idx+1 
    while idx2<nums.length 
     if pair==0 
     return [idx, idx2] 
     else 
     idx2+=1 
     end 
    end 
    idx+=1 
    end 
end 

誰かがこれに関する説明やエントリレベルのリソースを提供できる場合は、私は大いに感謝します。ありがとう。

編集:所望の出力に関するインデントや特異性の問題のため

申し訳ありません。私はこれに完全に新しく、時には詳細がスリップして、私はフィードバックを感謝します。ステップバイステップの論理的な実行をありがとう、それはまさに私が探していたものです。

+2

「仕事」とはどういう意味ですか?予想される入出力値は何ですか? – fylooi

+0

はインデントを修正するためにコードを編集しました。 2番目の例では、 'pair'変数は' while'の繰り返しごとに同じ値を持ちます。最初は、 'idx2'をインクリメントすることができるので変更できます。ニースユーザー名btw :) –

答えて

1

作業コードと壊れたコードを1つずつ見てみましょう。

のは、我々がオフに開始すると

idx = 0, idx2 = 0 

は、今、私たちは最初のwhileループ(ライン6)である

1 def two_sum(nums) 
2 idx = 0 
3 idx2 = 0 
4 
5 while idx < nums.length-1 
6  idx2 = idx+1 
7  while idx2 < nums.length 
8  pair = nums[idx] + nums[idx2] 
9  if pair == 0 
10   return [idx, idx2] 
11  else 
12   idx2 += 1 
13  end 
14  end 
15  idx += 1 
16 end 
17 end 

nums = [1, 2, -1, 3]

Supposablyワーキングコードを言ってみましょう

idx = 0, idx2 = 1 
ループ(ライン8)

idx = 0, idx2 = 1, pair = nums[0] + nums[1] = 3 

pair != 0ながら、第二

ので、私たちはelse声明になりました。 (ライン12)whileループバック第二に

idx = 0, idx2 = 2, pair is still 3 

我々は今、ループ(再びライン8)

idx = 0, idx2 = 2, pair = nums[0] + nums[2] = 0 

pair == 0ので、私たちはどのようにこれは[0, 2](ライン10)

を返しますコードが実行されています。

ブロークン・コード

1 def two_sum(nums) 
2 idx = 0 
3 idx2 = 0 
4 pair = nums[idx] + nums[idx2] 
5 while idx < nums.length-1 
6  idx2 = idx+1 
7  while idx2 < nums.length 
8  
9  if pair == 0 
10   return [idx, idx2] 
11  else 
12   idx2 += 1 
13  end 
14  end 
15  idx += 1 
16 end 
17 end 

我々は再び同じロジックを介して実行されます。

ループ(ライン2から4)しながら、私たちが最初にヒットする前に

idx = 0, idx2 = 0, pair = nums[0] + nums[0] = 2 

は、今、私たちはループしながら、最初にあり、whileループ(ライン6)第二中

idx = 0, idx2 = 1, pair = 2 

そして今、 、pair != 0は、私たちが目に今ループバックelse声明、(ライン12)

idx = 0, idx2 = 2, pair = 2 

を打ちます第2のwhileループの芸術。 pair != 2だから、私たちはelseというステートメントをヒットしました。

idx = 0, idx2 = 3, pair = 2 

pair != 0ので、私たちはelse文を打ちます。

idx = 0, idx2 = 4, pair = 2 

はだから今、idx2 < nums.lengthfalse, so we exit the second while loop, and now IDX = 1 'であり、我々は、サイクルを続けます。

あなたが見ることができるように、あなたはwhileループのpair外を宣言しているためpairは決してゼロので、もちろん、あなたが上0を取得しない限り、あなたは、if文を打つことは決してありませんので、それは、異なる値に再計算したことがありません最初の合計。

whileループは、必要なループの数が不明な場合に使用します。例として、ユーザーのエントリをチェックする場合があります。ユーザーがエントリを正しく取得するタイミングによっては、1回または10回ループする必要があります。この場合、実行する回数は正確に分かります。ですから、ここではイテレーターが良いでしょう。

これはどのように記述できるかの例です。おそらくこれを行うためのより良い方法があることを覚えておいてください。私は単に例を示したいと思います。

def two_sum(nums) 
    nums.each_with_index do |num1, idx1| 
    nums.each_with_index do |num2, idx2| 
     next if idx1 == idx2 
     return [idx1, idx2] if num1 + num2 == 0 
    end 
    end 
end 
関連する問題