SICP - 我对阶乘迭代过程的递归定义不好吗?
SICP - Is my recursive definition of an iterative process for factorial bad?
我正在研究 SICP 这本很棒的书。尽管很棒,但它确实是一本难懂的书。我遇到了长尾递归问题,id est,迭代过程的递归定义。
这本书介绍了阶乘的迭代过程:
(define (factorial n)
(fact-iter 1 1 n))
(define (fact-iter product counter max-count)
(if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
我在不看书本示例的情况下尝试了一种方法。我明白了:
(define (factorial n)
(factorial-iter n 1 n))
(define (factorial-iter a product counter)
(if (= counter 0)
product
(factorial-iter (- a 1)
(* product a)
(- counter 1))))
我的方法在某种意义上是错误的吗?
您的方法没有任何错误,它正确计算了阶乘,只有一些多余的东西。您可以注意到 a
和 counter
这两个变量 总是 相同的值,因为它们总是以相同的方式更新。所以你可以摆脱其中之一,并以这种方式简化你的功能:
(define (factorial n)
(factorial-iter n 1))
(define (factorial-iter a product)
(if (= a 0)
product
(factorial-iter (- a 1)
(* product a))))
最后,为了安全起见,您可以更改终止测试以查看 a
是否小于或等于 0,这样函数就不会以负参数无限循环:
(define (factorial-iter a product)
(if (<= a 0)
product
(factorial-iter (- a 1)
(* product a))))
我正在研究 SICP 这本很棒的书。尽管很棒,但它确实是一本难懂的书。我遇到了长尾递归问题,id est,迭代过程的递归定义。 这本书介绍了阶乘的迭代过程:
(define (factorial n)
(fact-iter 1 1 n))
(define (fact-iter product counter max-count)
(if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
我在不看书本示例的情况下尝试了一种方法。我明白了:
(define (factorial n)
(factorial-iter n 1 n))
(define (factorial-iter a product counter)
(if (= counter 0)
product
(factorial-iter (- a 1)
(* product a)
(- counter 1))))
我的方法在某种意义上是错误的吗?
您的方法没有任何错误,它正确计算了阶乘,只有一些多余的东西。您可以注意到 a
和 counter
这两个变量 总是 相同的值,因为它们总是以相同的方式更新。所以你可以摆脱其中之一,并以这种方式简化你的功能:
(define (factorial n)
(factorial-iter n 1))
(define (factorial-iter a product)
(if (= a 0)
product
(factorial-iter (- a 1)
(* product a))))
最后,为了安全起见,您可以更改终止测试以查看 a
是否小于或等于 0,这样函数就不会以负参数无限循环:
(define (factorial-iter a product)
(if (<= a 0)
product
(factorial-iter (- a 1)
(* product a))))