/* Compute n! in functional style in C */
int functional_fact(int n) {

  int loop(int n, int acc) {
    if (n == 0) return(acc);
    else return(loop(n-1,n*acc));
  }

return(loop(n,1));

}

;; Compute n! in functional style in Scheme
(define functional-fact
  (lambda (n)
    (letrec
      ((loop 
        (lambda (n acc)
          (if (= n 0)
            acc
            (loop (sub1 n) (* n acc))
	  ))))
      (loop n 1))))

/* Compute n! in imperative style in C */
int imperative_fact(int n) {

int acc;

while (n > 0) {
  acc *= n;
  n--;
}

return(acc);

;; Compute n! in imperative style in Scheme
(define imperative-fact
  (lambda (n)
    (letrec
      ((loop 
        (lambda (n acc)
          (if (= n 0)
            acc
	    (begin
	      (set! acc (* n acc)) ;; yukk
	      (set! n (sub1 n))
              (loop n acc)
            )))))
      (loop n 1))))

/* Compute nth Fibonacci number in functional style in C */
int functional_fib(int n) {

  int loop(int n, int acc1, int acc2) {
    if (n == 1) return(acc1);
    else return(loop(n-1,acc2,acc1+acc2));
  }

return(loop(n,1,2));

}

/* Compute nth Fibonacci number in functional style in Scheme */
(define fib
  (lambda (n)
    (letrec
      ((loop
        (lambda (n acc1 acc2)
	  (if (= n 1)
            acc1
            (loop (sub1 n) acc2 (+ acc1 acc2))
          ))))
    (loop n 1 2))))

/* Compute nth Fibonacci number in imperative style in C */
int imperative_fib(int n) {

int acc1, acc2, temp;

acc1 = 1;
acc2 = 2;

while (n > 1) {

  temp = acc2; /* Need to use temp variable */
  acc2 += acc1;
  acc1 = temp;
  n--;

}

return(acc1);

}

/* Compute nth Fibonacci number in imperative style in Scheme */
(define fib
  (lambda (n)
    (letrec
      ((loop
        (lambda (n acc1 acc2)
	  (if (= n 1)
            acc1
            (let ((temp acc2))
              (set! acc2 (+ acc1 acc2)) ;; yukk
              (set! acc1 temp)
              (set! n (sub1 n))
              (loop n acc1 acc2)
	    )))))
    (loop n 1 2))))