GCD はできませんnil
。2 つの整数には常に GCD があります。したがって、関数のロジックは、ある条件下でreturn nil
.
このreturn nil
状態を見ると、いつc1 == c2
(while
ループを抜けるか)発生しています。同時に、while
ループ内で value を返しますif c1 == c2
。この 2 つのケースは論理的に矛盾しています。つまり、条件のwhile
ループを終了し、条件をトリガーして条件を有効として処理し、正しい答えを返すc1 == c2
前に、その条件を無効として処理します。if c1 == c2
ロジックを少し単純化すると、次のようになります。
def d8(a,b)
return a if a == b # Just a simpler way of doing a small if statement
s = Stack.new # "Stack" must be a gem, not std Ruby; "Array" will work here
s.push(b)
s.push(a)
#c1 = s.pop # These two statements aren't really needed because of the first
#c2 = s.pop # "if" condition in the while loop
while c1 != c2
if s.count > 0
c1 = s.pop
c2 = s.pop
end
# if c1 == c2 isn't needed because the `while` condition takes care of it
if c1 > c2
c1 = c1 - c2
else
c2 = c2 - c1
end
# These pushes are the same at the end of both if conditions, so they
# can be pulled out
s.push(c2)
s.push(c1)
end
return c1 # This return occurs when c1 == c2
end
これは機能しますが、スタックの使用は不必要であり、アルゴリズムではまったく役に立たないことがより明らかになります。s.count > 0
は常に でありtrue
、変数をプッシュした直後に変数をポップしています (基本的に何もしません)。したがって、これは次と同等です。
def d8(a,b)
return a if a == b
c1 = a
c2 = b
while c1 != c2
if c1 > c2
c1 = c1 - c2
else
c2 = c2 - c1
end
end
return c1
end