2014-04-08 190 views
0
(define factorial 
    (lambda (n) 
    (if(= n 0) 
     1 
     (* n (factorial (- n 1)))))) 
(factorial 5 

傳統的遞歸階乘和尾遞歸階乘

(define factorial-tail 
    (lambda (n acc) 
    (if(= n 0) 
     acc 
     (factorial-tail (- n 1) (* acc n))))) 

(factorial-tail 5 1) 

嗨, 比方說,你有兩個功能,因爲我顯示出來。我要求你在這兩種情況下向我展示性能堆棧(堆棧幀)。 問候;)

回答

2

您可以使用trace

#lang racket 

(require racket/trace) 

(define factorial 
    (lambda (n) 
    (if (= n 0) 
     1 
     (* n (factorial (- n 1)))))) 
(trace factorial) 
(factorial 5) 
;; Output: 
;; >(factorial 5) 
;; > (factorial 4) 
;; > >(factorial 3) 
;; > > (factorial 2) 
;; > > >(factorial 1) 
;; > > > (factorial 0) 
;; < < < 1 
;; < < <1 
;; < < 2 
;; < <6 
;; < 24 
;; <120 
;; 120 

(define factorial-tail 
    (lambda (n acc) 
    (if (= n 0) 
     acc 
     (factorial-tail (- n 1) (* acc n))))) 
(trace factorial-tail) 
(factorial-tail 5 1) 
;; Output: 
;; >(factorial-tail 5 1) 
;; >(factorial-tail 4 5) 
;; >(factorial-tail 3 20) 
;; >(factorial-tail 2 60) 
;; >(factorial-tail 1 120) 
;; >(factorial-tail 0 120) 
;; <120 
;; 120