我正在尝试编写一个球拍程序,该程序不使用递归,而仅使用抽象列表函数(例如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))来求和。谁能向我解释如何使斐波那契数列/给我一个提示?
我自己写。我认为,如果我们建立复杂的列表而不是使用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)
[fib-seq
产生前n个斐波那契数字的列表,fib-sum
产生前n个斐波那契数字的总和。