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)}
非常感谢。很抱歉我花了这么长时间才回复。谢谢!很抱歉我花了这么长时间才回复。