2009/05/14

[scheme]階乗を末尾再帰にして計算過程もlistで欲しい

WS0793

こういう初歩的なことでも苦戦するから困る。

 

階乗

(define fact
  (lambda (n)
    (cond
     ((zero? n) 1)
     (else (* n (fact (- n 1)))))))

(fact 10)
;; => 3628800

 

階乗(末尾再帰)(のはず)

(define fact
  (lambda (n)
    (letrec ((iter (lambda (n ret)
                     (cond
                      ((zero? n) ret)
                      (else (iter (- n 1)(* n ret)))))))
      (iter n 1))))

(fact 10)
;; => 3628800

 

末尾再帰+計算過程list

(define fact
  (lambda (n)
    (letrec ((iter (lambda (n ret)
                     (cons
                      ret
                      (cond
                       ((zero? n) '())
                       (else (iter (- n 1)(* n ret))))))))
      (iter n 1))))

(fact 10)
;; => (1 10 90 720 5040 30240 151200 604800 1814400 3628800 3628800)

 

Cons the Magnificent !!

 

関連:

1 件のコメント:

  1. こんなのはどうでしょう?

    (define factorial-list
      (lambda (n)
        (let loop ([n (- n 1)] [lst (list n)])
          (if [= n 1]
              (reverse lst)
              (loop (- n 1) (cons (* n (car lst)) lst))))))

    返信削除