我在Ruby中编写Pascal的三角形,但不断收到错误消息:
pascalsTriangle.rb:3:在'triangle'中:未定义的方法`each'for 4:Fixnum(NoMethodError)
来自pascalsTriangle.rb:18
def triangle(n)
for r in n:
lst=[1]
term=1
k=0
(0..r+1).step(1){ |index|
term=term*(r-k+1)/k
lst.append(term)
k+=1
}
print lst
end
end
triangle(4)
答案 0 :(得分:4)
为什么在Ruby中编写C风格? : - )
解决问题会让你一次只关注一个问题而迭代器会使代码更具可读性。我正在使用二项式定理来计算三角形中的值。如果您不需要三角形中的超大值,这将足够快。
在我的虚拟linux上计算第1000行需要2.9秒:
# factorial method
def fact(n)
(1..n).reduce(:*)
end
# binomial theorem, n choose k
def binomial(n,k)
return 1 if n-k <= 0
return 1 if k <= 0
fact(n) / ( fact(k) * fact( n - k ) )
end
def triangle(nth_line)
(0..nth_line).map { |e| binomial(nth_line, e) }
end
p triangle(5)
答案 1 :(得分:0)
最终源代码:
def triangle(n)
(0..n).each{|r|
lst=[1]
term=1
k=1
(0..r-1).step(1){|index|
term=term*(r-k+1)/k
lst.push term
k+=1
}
p lst
}
end
triangle(4)
的变化:
for r in n:
上有语法错误。 k=0
上的逻辑错误导致除零。 (0..r+1)
已更改为(0..r-1)
append
方法。已更改为push
p
代替print
答案 2 :(得分:0)
最后是pascale(num),它迭代三角形的新行 maping索引号或(k)每行(n)。
如果你想真正理解这是如何工作的,请注释掉 pascale,只需通过find_num运行数字((行号), (索引号))。然后比较三角形的图片来看 你自己的魔力
-
def find_num(n, k)
result = factorial(n) / (factorial(k) * factorial(n - k))
end
def pascale(num)
i = 0
scale = 75
while i <= num
new_arr = []
(0..i).map {|x| new_arr << find_num(i, x)}
p new_arr.to_s.rjust(50 + scale)
i += 1
scale += 1
end
def factorial(num)
if num == 0
return 1
else
num *= factorial(num - 1)
end
end
end
pascale(12)