-->

杨辉三角的行序列(Pascal's Triangle Row Sequence)

2019-09-22 09:51发布

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

我想使用的算法,我发现。 这里是算法本身:

v C案例= V * C-1((R - B)/ C)

RC应该是行和列,并且V 0 = 1。 该算法可以在一节中的维基百科页面上专门找到“计算与各行或对角线。”

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

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

我知道这根本算不上什么,但我一直在试图找到一个作用域功能挣扎了很多letlambda纳入列值。 此外,我也一直在努力的递归。 我真的不知道如何建立基本情况,以及如何去下一步。 基本上,我已经得到相当失去无处不在。 我知道这是不是出很多,但在正确的方向的任何步骤将不胜感激。

Answer 1:

使用作为引导进入维基百科,这是计算为链接描述给予其行和列的帕斯卡三角的值,直接实现的算法:

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


Answer 2:

我讨论杨辉三角在我的博客 。

在你的问题,对于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}。



文章来源: Pascal's Triangle Row Sequence