SICP - 我对因子不好的迭代过程的递归定义是什么?

时间:2016-09-05 18:24:25

标签: iteration lisp racket factorial sicp

我正在研究这本很棒的书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))))     

在某种意义上我的方法是否错误?

1 个答案:

答案 0 :(得分:2)

你的方法中没有错误的,它正确计算了阶乘,只有多余的东西。您可以注意到,acounter这两个变量的总是相同的值,因为它们始终以相同的方式更新。所以你可以摆脱其中一个,并以这种方式简化你的功能:

(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))))