racketfibonaccinon-recursive

How to make fibonacci sequence in racket using abstract list functions


I am trying to write a racket program that computes the sum of the first n terms in a fibonacci sequence without using recursion, and only using abstract list functions (so map, builld-list, foldr, foldl). I can use helper functions. I'm stuck on how to make a list of the fibonacci numbers without using recursion. I thought I could use a lambda function:

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

But I am not sure how to generate the input list/how to add this to a function. Once I have a fibonacci sequence I know I can just use (foldl + (car lst) (cdr lst)) to find the sum. Could anyone explain to me how to make the fibonacci sequence/give me a hint?


Solution

  • ; 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)
    

    Upgrade version 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)