Racket 传统的递归阶乘和尾部递归阶乘

Racket 传统的递归阶乘和尾部递归阶乘,racket,Racket,) 嗨, 假设在我出现的时候你有两个函数。我要求你们向我展示这两种情况下的性能堆栈(堆栈帧)。 问候;) 你可以用 #朗球拍 (需要拍/跟踪) (定义阶乘) (λ(n) (如果(=n0) 1. (*n(阶乘(-n1(()()))) (跟踪阶乘) (阶乘5) ;; 输出: ;; >(阶乘5) ;; > (阶乘4) ;; > >(阶乘3) ;; > > (阶乘2) ;; > > >(阶乘1) ;; > > > (阶乘0) ;; < < < 1. ;; < < (阶乘尾320) ;; >(阶乘尾部26

)

嗨, 假设在我出现的时候你有两个函数。我要求你们向我展示这两种情况下的性能堆栈(堆栈帧)。 问候;)

你可以用

#朗球拍
(需要拍/跟踪)
(定义阶乘)
(λ(n)
(如果(=n0)
1.
(*n(阶乘(-n1(()())))
(跟踪阶乘)
(阶乘5)
;; 输出:
;; >(阶乘5)
;; > (阶乘4)
;; > >(阶乘3)
;; > > (阶乘2)
;; > > >(阶乘1)
;; > > > (阶乘0)
;; < < < 1.
;; < < (阶乘尾320)
;; >(阶乘尾部260)
;; >(阶乘尾1120)
;; >(阶乘尾0 120)
;;
(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)
#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