Ruby 为TAOCP Knuth的介绍性练习测试计数器

Ruby 为TAOCP Knuth的介绍性练习测试计数器,ruby,greatest-common-divisor,knuth,Ruby,Greatest Common Divisor,Knuth,Donald Knuth在《计算机编程艺术》(art of computer Programming)第一卷第一章中的练习与使用欧几里德的gcd算法计算剩余步骤的平均值有关。我的代码完美地返回了GCD,并且已经过测试。我无法让它返回剩余步骤,并且我的第二个测试标记为failing test,代码中带有注释,无法获得正确的剩余步骤,并且对于gcdTestObject上的gcdRemainerSteps,将只返回1 require 'minitest/autorun' class GCDTest

Donald Knuth在《计算机编程艺术》(art of computer Programming)第一卷第一章中的练习与使用欧几里德的gcd算法计算剩余步骤的平均值有关。我的代码完美地返回了GCD,并且已经过测试。我无法让它返回剩余步骤,并且我的第二个测试标记为failing test,代码中带有注释,无法获得正确的剩余步骤,并且对于gcdTestObject上的gcdRemainerSteps,将只返回1

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 
            @m=@n
            @n=r
            r= @m % @n
        end
        return @n   
    end

    def gcdRemainderSteps
        r=@m % @n
        counter=1
        until r==0 
            counter+=1
            @m=@n
            @n=r
            r=@m % @n

        end
        return counter
    end
end
要求“小型测试/自动运行”
类GCDTest
第二段代码是我为测试一个程序中的计数而编写的,它工作出色,并且完美地通过了所有测试

正如预期的那样,计数器返回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
#直到_loop_test.rb
需要“微型测试/自动运行”
直到测试
也许GCD的方法不应该修改其成员<只有在
euclidGcd()
修改了成员变量后,才会调用code>gcdRemainderSteps()

我做了这个改变,测试通过了:

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

谢谢,我使用的是实例变量。euclidGcd破坏了实例变量的完整性。我将实例变量重置为新名称,测试通过。谢谢你的帮助,先生!不客气。你应该使用我答案下面的“添加评论”链接,而不是使用“答案”空白。否则,网站会将您的评论作为备选答案呈现给其他访问者吉姆9分钟前