目前,我正在努力寻找帕斯卡三角的行序列。 我想输入的行数和输出数列在列表中,直到该行。 例如, (Pascal 4)
将得到的结果(1 1 1 1 2 1 1 3 3 1)
我想使用的算法,我发现。 这里是算法本身:
v C案例= V * C-1((R - B)/ C)
R和C应该是行和列,并且V 0 = 1。 该算法可以在一节中的维基百科页面上专门找到“计算与各行或对角线。”
这里是我到目前为止的代码:
(define pascal n)
(cond((zero? n) '())
((positive? n) (* pascal (- n 1) (/ (- n c)c))))
我知道这根本算不上什么,但我一直在试图找到一个作用域功能挣扎了很多let
或lambda
纳入列值。 此外,我也一直在努力的递归。 我真的不知道如何建立基本情况,以及如何去下一步。 基本上,我已经得到相当失去无处不在。 我知道这是不是出很多,但在正确的方向的任何步骤将不胜感激。
使用作为引导进入维基百科,这是计算为链接描述给予其行和列的帕斯卡三角的值,直接实现的算法:
#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)
我讨论杨辉三角在我的博客 。
在你的问题,对于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)
基础案例是(= rc)
在所述第一功能和(zero? r)
中的第二个。
如果你想要写清楚标,你可以采用通过的TeX使用的符号:标是由一个插入符下划线和上标介绍,随着周围的任何东西比一个字符大括号。 因此,在VC中的符号是V_C和VC-1的符号将V_ {C-1}。