1

我正在用 Ruby 编写 Pascal 的三角形,但不断收到错误消息:

pascalsTriangle.rb:3:in 'triangle': 4:Fixnum (NoMethodError) 的未定义方法 'each'
来自 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)
4

3 回答 3

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)
于 2014-01-18T14:04:20.113 回答
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
于 2013-10-06T07:52:51.467 回答
0
  • Factorial(num),接受一个数字并返回它的阶乘。
  • find_num(n, k),是帕斯卡三角形的数学公式。!n/ !k * !(n - k) ---- '!' =数字的阶乘
  • 最后是 pascale(num),它通过为 (n) 的每一行映射索引号或 (k) 来迭代三角形的新行。

  • 如果你想真正了解它是如何工作的,请注释掉帕斯卡,并简单地通过 find_num((row number), (index number)) 运行数字。然后比较三角形的图片,看看你自己的魔力

-

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)
于 2014-06-15T02:44:21.697 回答