2

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

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

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

rc应该是行和列,并且V 0 =1。该算法可以在维基百科页面上标题为“计算和单个行或对角线”的部分中具体找到。

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

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

我知道这几乎没什么,但我一直在努力寻找使用 alet或 alambda来合并列值的函数范围。此外,我也一直在为递归而苦苦挣扎。我真的不知道如何建立基本案例以及如何进入下一步。基本上,我到处都迷路了。我知道这并没有显示太多,但我们将不胜感激朝着正确方向迈出的任何一步。

4

2 回答 2

3

使用维基百科中的条目作为指南,这是计算帕斯卡三角形中给定行和列的值的算法的简单实现,如链接中所述:

#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)
于 2012-09-13T20:43:41.463 回答
3

我在博客上讨论了帕斯卡三角。

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

于 2012-09-13T20:46:15.483 回答