Recursion 帕斯卡';s三角形行序列
我目前正在寻找帕斯卡三角形的行序列。我想输入行号并输出列表中的数字序列,直到该行。例如,Recursion 帕斯卡';s三角形行序列,recursion,scheme,pascals-triangle,Recursion,Scheme,Pascals Triangle,我目前正在寻找帕斯卡三角形的行序列。我想输入行号并输出列表中的数字序列,直到该行。例如,(Pascal 4)将给出结果(1 1 2 1 3 1) 我正在尝试使用我发现的算法。以下是算法本身: Vc=Vc-1*((r-c)/c) r和c应该是行和列,V0=1。该算法可以在维基百科页面的“计算和单行或对角线”部分找到 以下是我目前掌握的代码: (define pascal n) (cond((zero? n) '()) ((positive? n) (* pascal (- n 1
(Pascal 4)
将给出结果(1 1 2 1 3 1)
我正在尝试使用我发现的算法。以下是算法本身:
Vc=Vc-1*((r-c)/c)
r和c应该是行和列,V0=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}。感谢您的快速响应!第一个函数用c作为计数器。let循环将c设置为1,并且每次c都将加1,直到r和c相等为止,返回的行将在其中。我也可以看到算法是如何实现的。我不确定的一部分是行(列表1)。这就是(1)。在路过(汽车路过)后,这是否意味着我们现在有一个空位?该元素1现在与(-r1)(/c)相乘。我的理解是cons应该结合元素和列表。我看到了元素。但是列表应该是后面的那一行吗?在函数的最后一行,cons将新元素放在现有行的最前面,它使用维基百科的公式计算新元素。例如,当被称为(行4)时,变量行最初是(1),然后第一次通过循环变为(31),c变为2,然后第二次通过循环行变为(3 1),c变为3,然后第三次通过循环行变为(1 3 1),c变为4,然后循环的第四次r和c都是4,因此函数返回行的当前值,即(1 3 1)。