Tail Recursion: Conceptual Solutions

Identifying Tail recursion

For each of the following functions, identify whether or not it is tail recursive and explain why.

(define (f1 x)
    (if (= x 0)
        1
        (if (= (remainder x 2) 0)
            (+ 1 (f1 (- x 1)))
            (+ x (f1 (- x 1))))))
Not tail recursive because in both of the recursive cases, there is a calculation that must be done after the recursive call.

(define (f2 x)
    (define (helper y z)
        (if (= y 0)
            z
            (helper (- y 1) (+ z y))))
    (helper x 0))
Yes, this function is tail recursive because there are no calculations after the recursive calls, so python only needs to keep one frame open.

(define (f3 x):
    (if (= x 0)
        0
        (f1 x)))
This function isn't actually recursive, so it can't be tail recursive.

Creating a tail recursive function

Turn the summer function into a tail recursive function. Hint: Use a helper function.

(define (summer num)
    (if (= x 0)
        0
        (+ num (summer (- num 1)))))
(define (summer num)
    (define (helper n total)
        (if (= x 0)
            total
            (helper (- n 1) (+ total n))))
    (helper num 0))

Code writing

Write a tail recursive function that takes in a list and reverses it.
> (define lst '(1 2 3 4 5))
> (reverse lst)
(5 4 3 2 1)
(define (reverse lst)
    (define (helper lst rev)
        (if (null? lst)
            rev
            (helper (cdr lst) (cons (car lst) rev))))
    (helper lst nil))