如何使用抽象列表功能在球拍中制作斐波那契数列

问题描述 投票:1回答:2

我正在尝试编写一个球拍程序,该程序不使用递归,而仅使用抽象列表函数(例如map,builld-list,foldr,foldl)来计算斐波纳契序列中前n个项的和。我可以使用辅助功能。我坚持不使用递归就如何列出斐波那契数字。我以为我可以使用lambda函数:

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

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

racket fibonacci non-recursive
2个回答
1
投票

我自己写。我认为,如果我们建立复杂的列表而不是使用foldr太难了。所以就...(哈哈)

; a is not important
; '(0 1) -> '(1 0+1)
(define (fib-rule a ls)
  (cond
    [(list? ls)
     (list (second ls) (+ (first ls) (second ls)))]
    [else (error "error")]))

; This is how I figur out this method.
#|
'(1 2 3 4 (0 1))
-> '(1 2 3 (1 1))
-> '(1 2 (1 2))
-> '(1 (2 3))
-> '(3 5)
|#

(define (my-fib n)
  (cond
    [(= n 0) 0]
    [(= n 1) 1]
    [(> n 1)
     (local ((define pre-list1 (build-list (- n 1) (lambda (x) x))))
       (second (foldr fib-rule '(0 1) pre-list1)))]))

(my-fib 10)
(build-list 10 my-fib)

0
投票

[fib-seq产生前n个斐波那契数字的列表,fib-sum产生前n个斐波那契数字的总和。

© www.soinside.com 2019 - 2024. All rights reserved.