Pascal在Ruby中的三角形

时间:2013-10-06 03:44:45

标签: ruby pascals-triangle

我在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)

3 个答案:

答案 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)

的变化:

  1. for r in n:上有语法错误。
  2. k=0上的逻辑错误导致除零。
  3. (0..r+1)已更改为(0..r-1)
  4. 数组没有append方法。已更改为push
  5. p代替print

答案 2 :(得分:0)

  • Factorial(num),取一个数字并返回它的阶乘。
  • find_num(n,k),是pascales三角形的数学公式。 !N / !k *!(n - k)----&#39;!&#39; =阶乘数
  • 最后是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)