所以给了我一段关于谐波系列的代码,老实说,我只是不知道如何处理它。所以这就是:
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.+(?)
显然,参数将成为一个分数对象,但老实说我对它的外观有点困惑。
或许我对这个问题的解决方法完全错了?显然,我不希望有人为此编写完整的代码,但我绝对会感谢任何建议和有用的指示。此外,抱歉文本墙。我试着尽量简洁。
答案 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)}