首页 > 解决方案 > 如何使用抽象列表函数在球拍中制作斐波那契数列

问题描述

我正在尝试编写一个球拍程序,它在不使用递归的情况下计算斐波那契数列中前 n 项的总和,并且只使用抽象列表函数(如 map、builld-list、foldr、foldl)。我可以使用辅助功能。我被困在如何在不使用递归的情况下制作斐波那契数列。我以为我可以使用 lambda 函数:

(lambda (lst) (+ (list-ref lst (- (length lst) 1)) (list-ref lst (- (length lst 2)))))

但我不确定如何生成输入列表/如何将其添加到函数中。一旦我有了斐波那契数列,我就知道我可以使用 (foldl + (car lst) (cdr lst)) 来求和。谁能向我解释如何制作斐波那契数列/给我一个提示?

标签: racketfibonaccinon-recursive

解决方案


; This is how I figure out
#|
(1 2 3 4 (0 1))
-> (1 2 3 (1 1))
-> (1 2 (1 2))
-> (1 (2 3))
-> (3 5)
|#

(define (fib n)
  (cond
    [(= n 0) 0]
    [(= n 1) 1]
    [(> n 1)
     (second
      (foldr (λ (no-use ls) (list (second ls) (+ (first ls) (second ls))))
             '(0 1)
             (build-list (- n 1) (λ (x) x))))]))

(fib 10)
(build-list 10 fib)

升级版本 2

(define (fib-v2 n)
  (first
   (foldr (λ (no-use ls) (list (second ls) (+ (first ls) (second ls))))
          '(0 1)
          (build-list n (λ (x) x)))))


(build-list 10 fib-v2)


推荐阅读