我目前正致力于构建一个返回一行Pascal三角形的函数。我的函数传入一个包含Pascal三角形中的行的列表,并根据传入的行返回下一行。 恩。传入'(1 2 1)并且应该返回'(1 3 3 1)。 但是我似乎无法在列表中找到开头1。
(define build-next
(lambda(thisRow)
(cond
[(null? thisRow) '(1)]
[(null? (cdr thisRow)) (cons 1 (cdr thisRow))]
[else (cons (+ (car thisRow) (car (cdr thisRow))) (build-next(cdr thisRow)))])))
(build-next '(1 2 1))
运行此代码将为我提供输出
'(3 3 1)
没有前导1
答案 0 :(得分:0)
这是一个可能的解决方案:
(define build-next
(lambda(thisRow)
(define helper-build-next
(lambda (lst prev)
(if (null? lst)
(list prev)
(cons (+ prev (car lst)) (helper-build-next (cdr lst) (car lst))))))
(if (null? thisRow)
(list 1)
(cons (car thisRow) (helper-build-next (cdr thisRow) (car thisRow))))))
递归是通过辅助函数执行的,该函数获取行的其余部分和行的前一个元素。最初,该函数检查参数是否为空列表,以便返回三角形的第一行。否则,使用初始参数调用辅助函数。
答案 1 :(得分:0)
您还可以使用命名let
来编写build-next
,如下所示:
(define (build-next row)
(let loop ([row row]
[acc 0])
(cond
[(zero? acc)
(cons 1 (loop row (add1 acc)))]
[(null? row) empty]
[(null? (cdr row)) (list 1)]
[else
(cons (+ (car row) (cadr row))
(loop (cdr row) acc))])))
循环参数 acc 用作累加器,在下一行添加前导1(即第一个cond情况)。
例如,
(build-next '()) ;;=> '(1)
(build-next '(1)) ;;=> '(1 1)
(build-next '(1 1)) ;;=> '(1 2 1)
(build-next '(1 2 1)) ;;=> '(1 3 3 1)
(build-next '(1 3 3 1)) ;;=> '(1 4 6 4 1)
(build-next '(1 4 6 4 1)) ;;=> '(1 5 10 10 5 1)
答案 2 :(得分:0)
如果输入行的第一个元素为零,则函数有效。
将原始函数重命名为build-next-helper
并进行介绍
一个新的build-next
,只需在前缀零后调用现有函数就可以正常工作:
(define build-next-helper
(lambda (thisRow)
(cond
[(null? thisRow) '(1)]
[(null? (cdr thisRow)) (cons 1 (cdr thisRow))]
[else (cons (+ (car thisRow) (car (cdr thisRow)))
(build-next-helper (cdr thisRow)))])))
(define (build-next thisRow)
(build-next-helper (cons 0 thisRow)))
(build-next '(1 2 1))