【问题标题】:SICP - Is my recursive definition of an iterative process for factorial bad?SICP - 我对阶乘迭代过程的递归定义是否不好?
【发布时间】:2016-09-05 18:24:24
【问题描述】:

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

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

【问题讨论】:

    标签: iteration lisp racket factorial sicp


    【解决方案1】:

    您的方法没有任何错误,它正确计算了阶乘,只有一些多余的东西。您可以注意到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))))
    

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 2013-06-19
      • 2012-06-25
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 2016-02-24
      • 2021-08-24
      • 1970-01-01
      相关资源
      最近更新 更多