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