返回新创建的列表,其中包含函数

时间:2017-04-28 07:10:28

标签: recursion scheme racket pascals-triangle

我目前正致力于构建一个返回一行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

3 个答案:

答案 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))