Ruby 展开一个计算谐波级数的程序

Ruby 展开一个计算谐波级数的程序,ruby,class,object,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 = @denomi

所以我得到了一段关于谐波级数的代码,老实说,我不知道如何处理它。这就是:

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
然后我创建了一个对象来引用这个类

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

那么,既然“reduce”和“gcd”是私有的,这是否意味着我主要需要关注+(rhs)?会不会像这样:

f1.+(?)
显然,这个参数将是一个分数对象,但老实说,我对它的样子有点困惑


或者我对这个问题的看法完全错误?显然,我不希望有人为此编写完整的代码,但我肯定会感谢任何建议和有用的指针。还有,对不起,这里有文字墙。我尽量简明扼要

您可以使用
.tap
inside inject,它将
#+
的结果作为
x
变量发送到block。
#+
的结果是一个分数,因此我们可以在块内的
x
上调用
#print

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
等,请尝试编辑块。

您可以使用
。点击
inside inject,它将
+
的结果作为
x
变量发送到块。
#+
的结果是一个分数,因此我们可以在块内的
x
上调用
#print

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
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
如果需要
h1: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附带了自己的分数类,称为Rational。所有代码可替换为:

r = Rational(0,1)  # r = 0 is fine too
1.upto(5){|i| p r += Rational(1,i)}
然而,Ruby附带了自己的分数类,称为Rational。所有代码可替换为:

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

非常感谢。很抱歉我花了这么长时间才回复。谢谢!很抱歉我花了这么长时间才回复。