帕斯卡的三角行序列

时间:2012-09-13 19:41:59

标签: recursion scheme pascals-triangle

我正在寻找Pascal三角形的行序列。我想输入行号并在列表中输出数字序列直到该行。例如,(Pascal 4)会给出结果(1 1 1 1 2 1 1 3 3 1)

我正在尝试使用我找到的算法。这是算法本身:

  

V c = V c-1 *((r - c)/ c)

r c 应该是行和列,并且V 0 = 1。该算法可以在维基百科页面的“计算和单个行或对角线”一节中找到。

这是我到目前为止的代码:

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

我知道这几乎不算什么,但我一直在努力寻找使用letlambda来合并列值的功能。另外,我也一直在努力进行递归。我真的不知道如何建立基本案例以及如何进入下一步。基本上,我到处都迷失了。我知道这并没有显示出多少,但是朝着正确方向迈出的任何一步都将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

使用维基百科中的entry作为指导,这是一个简单的算法,用于计算Pascal三角形中给定行和列的值,如链接中所述:

#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)

现在我们需要一个程序将所有值粘在一起直到所需的行;这适用于Racket:

(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)

答案 1 :(得分:3)

我在blog讨论了Pascal的三角形。

在您的问题中,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}。