2017-05-03 4 views
0

Donald Knuthによるコンピュータプログラミングの第1巻第1章の練習 - ユークリッドのgcdアルゴリズムを使用して残りのステップの平均を取ることと関連があります。私のコードはGCDを完全に返し、そうするためにテストされています。残りのステップを返すことができず、2番目のテストで失敗したテストがマークされ、コード内のコメントで正しい残りのステップが得られず、gcdTestObjectのgcdRemainerStepsに1が返されます。TAOCP Knuthの入門練習用カウンタのテスト

require 'minitest/autorun' 


class GCDTest < Minitest::Test 
    def test_euclid_gcd 
    gcdTestObject=GCD.new(20,5) 
    assert gcdTestObject.euclidGcd==5 
     assert gcdTestObject.gcdRemainderSteps==1 

    end 

    def test_euclid_two 
     gcdTestObject=GCD.new(13,8) 
     assert gcdTestObject.euclidGcd==1 
    #Failing TEST Passes on 1 not on 5 
    assert gcdTestObject.gcdRemainderSteps==5 
    end 
end 



class GCD 
    attr_accessor :m,:n 
    def initialize(m,n) 
     @m=m 
     @n=n 
    end 

    def euclidGcd 
     r= @m % @n 
     until r==0 
      @[email protected] 
      @n=r 
      r= @m % @n 
     end 
     return @n 
    end 

    def gcdRemainderSteps 
     [email protected] % @n 
     counter=1 
     until r==0 
      counter+=1 
      @[email protected] 
      @n=r 
      [email protected] % @n 

     end 
     return counter 
    end 
end 

私がプログラムされるまでにカウントテストするために書かれているコードの2番目の作品は見事に動作し、それは完全にすべてのテストに合格しました。

これは、予想通り100でカウンタを返し、テストは緑色になります。

#until_loop_test.rb 
require 'minitest/autorun' 


class Until_test < Minitest::Test 

    def test_till_100_steps 
     myUntilTestObject=UntilTester.new 

     assert myUntilTestObject.untilLoopCount==100 

    end 
end 


class UntilTester 

    def untilLoopCount 
     x=0 
     counter=0 
     until x==100 
      x+=1 
      counter+=1 
     end 
     return counter 
    end 
end 

答えて

1

多分、GCDの方法はそのメンバーを改変してはならない。 gcdRemainderSteps()は、euclidGcd()がメンバー変数を変更した後にのみ呼び出されます。

私はこの変更を行って、テストが合格:

def euclidGcd 
    m = @m 
    n = @n 
    r = m % n 
    until r==0 
     m = n 
     n = r 
     r = m % n 
    end 
    return n 
end 

テスト結果:

# Running: 

.. 

Finished in 0.001809s, 1105.5202 runs/s, 2211.0405 assertions/s. 

2 runs, 4 assertions, 0 failures, 0 errors, 0 skips 
+0

は、私はインスタンス変数を使用していた、ありがとうございました。そして、euclidGcdはインスタンス変数の完全性を破壊しました。インスタンス変数を新しい名前にリセットし、テストに合格しました。助けてくれてありがとう! –

+0

ようこそ。 "答え"の空白を使用する代わりに、私の答えの下に "コメントを追加"リンクを使用する必要があります。それ以外の場合は、他の訪問者への代替回答としてコメントが表示されます。 - Jim U 9分前 –