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