2013-10-06 49 views
1

我寫帕斯卡爾在Ruby的三角形,但不斷收到錯誤消息:楊輝三角在Ruby中

pascalsTriangle.rb:3: '三角':未定義的方法`每個」爲 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

爲什麼downvote? – karatedog

回答

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
+0

非常感謝你 – RuneScape

4

在Ruby中爲什麼代碼C風格? :-)

打破問題可以讓你一次專注於一個問題,迭代器會使代碼更具可讀性。我使用二項式定理來計算三角形中的值。如果你不需要三角形的超大值,這將會足夠快。

計算第1000行承擔了我的Linux虛擬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) 
0
  • 階乘(NUM),接受一個數字,並返回它的階乘。
  • find_num(n,k)是pascales三角形的數學公式。 !n/ !k *!(n - k)----'!' = numberial number
  • 最後pascale(num),這迭代了一個新的三角形行 映射索引號或(k)的每行(n)。

  • 如果你想真正瞭解它是如何工作註釋掉 帕斯卡爾,並且只需通過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)