2012-09-13 130 views
2

我目前正在尋找帕斯卡三角形的行序列。我想輸入行號並將列表中的數字序列輸出到該行。例如,(Pascal 4)會給出結果(1 1 1 1 2 1 1 3 3 1)帕斯卡的三角形行序列

我想使用我發現的算法。這裏是該算法本身:

V Ç = V C-1 *((R - C)/ C)

- [RÇ應該是行和列,並且V = 1。該算法可以在維基百科頁面的「計算和單行或對角線」部分中找到。

下面是代碼,我到目前爲止有:

(define pascal n) 
    (cond((zero? n) '()) 
     ((positive? n) (* pascal (- n 1) (/ (- n c)c)))) 

我知道這根本算不上什麼,但我一直在試圖找到一個let作用域功能掙扎了很多或lambda納入列值。另外,我也在遞歸上掙扎。我不知道如何建立基本案例以及如何進入下一步。基本上,我到處都迷路了。我知道這並沒有太多的表現,但是我們將不勝感激。

回答

3

使用作爲指導在維基百科entry,這是一個簡單的實現算法,用於計算給定它的行和列中的帕斯卡三角的值,如在鏈接描述:

#lang racket 

(define (pascal row column) 
    (define (aux r c) 
    (if (zero? c) 
     1 
     (* (/ (- r c) c) 
      (aux r (sub1 c))))) 
    (aux (add1 row) column)) 

例如,下面將返回值的前四行,注意到,行和列開始的零:

(pascal 0 0) 

(pascal 1 0) 
(pascal 1 1) 

(pascal 2 0) 
(pascal 2 1) 
(pascal 2 2) 

(pascal 3 0) 
(pascal 3 1) 
(pascal 3 2) 
(pascal 3 3) 

現在我們需要一個過程來所有的值粘在一起,直到所需的行;這適用於球拍:如預期

(define (pascal-up-to-row n) 
    (for*/list ((i (in-range n)) 
       (j (in-range (add1 i)))) 
    (pascal i j))) 

結果:

(pascal-up-to-row 4) 
> '(1 1 1 1 2 1 1 3 3 1) 
3

我在blog討論楊輝三角。

在你的問題中,Vc的表達式只是一行。這相當於這樣的代碼:

(define (row r) 
    (let loop ((c 1) (row (list 1))) 
    (if (= r c) 
     row 
     (loop (+ c 1) (cons (* (car row) (- r c) (/ c)) row))))) 

然後你只需拼湊一堆行,使三角:

(define (rows r) 
    (let loop ((r r) (rows (list))) 
    (if (zero? r) 
     rows 
     (loop (- r 1) (append (row r) rows))))) 

而這裏的輸出:

> (rows 4) 
(1 1 1 1 2 1 1 3 3 1) 

基本情況第一個功能是(= r c),第二個功能是(zero? r)

如果你想清楚地寫下標,你可以採用TeX使用的符號:下劃線由下劃線和上標通過插入符號引入,並且括號大於一個字符。因此你的符號中的Vc將是V_c,而你的符號中的Vc-1將是V_ {c-1}。

+0

感謝您的快速響應! 所以第一個函數有c作爲計數器。 let循環將c設置爲1,並且c將每次加1,直到r和c相等,並返回哪一行。我可以看到算法是如何實現的。我不確定的一部分是行(列表1)。所以這使得'(1)。排過後(汽車排),這是否意味着我們現在有一個空集?該元素1現在與( - r 1)(/ c)相乘。我的理解是,缺點應該是組合元素和列表。我看到了這個元素。但是列表應該排在後面? – Nopiforyou

+0

在函數的最後一行,缺點是使用WikiPedia公式計算的新元素位於現有行的開頭。例如,當被調用爲(第4行)時,變量行最初爲(1),那麼在第一次通過循環時變爲(3 1)並且c變爲2,則第二次通過循環行變成(3 3 1 )和c變爲3,那麼第三次通過循環行變爲(1 3 3 1)並且c變爲4,那麼第四次通過循環r和c都是4,所以函數返回行的當前值,這是(1 3 3 1)。 – user448810