扩展程序以计算谐波系列

时间:2017-03-24 10:27:03

标签: ruby class object

所以给了我一段关于谐波系列的代码,老实说,我只是不知道如何处理它。所以这就是:

class Fraction
attr_accessor :numerator, :denominator


def initialize(n, d)
    @numerator = n
    @denominator = d
end


def +(rhs)
    n = @numerator*rhs.denominator + @denominator*rhs.numerator
    d = @denominator*rhs.denominator

    n, d = reduce(n, d)

    return Fraction.new(n, d)
end


def print
    puts "#{@numerator} / #{@denominator}"
end


def reduce(n, d)
    r = gcd(n, d)
    return n / r, d / r
end


def gcd(a, b)
    if a % b == 0
        return b
    else
        return gcd(b, a % b)
    end
end

private :reduce, :gcd
end

最终结果应该是这样的。如果用户输入数字5:

h1:1/1

h2:3/2

h3:11/6

h4:25/12

h5:137/60

因此它还会显示之前的所有谐波步骤。

现在这就是我所挣扎的,我从另一个类似的问题中看到了这行代码:

def harmonic_sum(n)
   (1..n).inject(Fraction.new(0,1)) {|r, i| r + Fraction.new(1,i) }
end

如果没有这个问题,甚至可以解决这个问题吗?

如果不是,我将如何修改它以便显示所有谐波步骤?

我没有使用这段代码就先试了一下。我首先要求用户输入数字:

print "What harmonic sums do you wish to calculate?"
num = gets.to_f

然后我创建了一个引用Class

的对象
f1 = Fraction.new(?)

好吧,我不确定参数是什么。它显然需要2个参数,所以如果用户只写了5个,那么它是Fraction.new(1,num)还是Fraction.new(num,1)还是完全不同的东西?

那么,既然“减少”和“gcd”是私有的,这是否意味着我主要不得不关注+(rhs)?它看起来像这样:

f1.+(?)

显然,参数将成为一个分数对象,但老实说我对它的外观有点困惑。

或许我对这个问题的解决方法完全错了?显然,我不希望有人为此编写完整的代码,但我绝对会感谢任何建议和有用的指示。此外,抱歉文本墙。我试着尽量简洁。

2 个答案:

答案 0 :(得分:1)

您可以在注入内部使用.tap,这将#+的结果作为x变量发送。 #+的结果是一个小数,因此我们可以在区块内的#print上调用x

def harmonic_sum(n)
   (1..n).inject(Fraction.new(0,1)) do |r, i|
     (r + Fraction.new(1,i)).tap {|x| x.print}
   end
end

如果您需要h1: 1/1等,请尝试编辑该块

答案 1 :(得分:1)

print "What harmonic sums do you wish to calculate?"
num = gets.to_i

f1 = Fraction.new(0,1)
1.upto(num) do |i|
  f1 = f1 + Fraction.new(1,i)
  f1.print
end

然而,Ruby附带了它自己的Fraction类,称为Rational。所有代码都可以替换为:

r = Rational(0,1)  # r = 0 is fine too
1.upto(5){|i| p r += Rational(1,i)}