让Racket中的循环代码。递归阶乘

时间:2014-04-08 12:16:48

标签: loops racket

考虑:

(define (factorial x)
  (let loop ((x x)
             (acc 1))
    (if (zero? x)
        acc
        (loop (sub1 x) (* x acc)))))

我不明白工作是如何让这里的。而且,我不明白这段代码。

1 个答案:

答案 0 :(得分:4)

您的示例与

的作用相同
(define (factorial x)
  (define (loop x acc)
    (if (zero? x)
        acc
        (loop (sub1 x) (* x acc))))
   (loop x 1))

的作用相同
  (define (factorial x)
    (loop x 1))

  (define (loop x acc)
    (if (zero? x)
        acc
        (loop (sub1 x) (* x acc))))

要了解程序的工作原理,最好的建议是使用DrRacket中的步进器。 由于步进器必须以“中级”教学语言运行,因此将此版本(请注意最后一个示例)粘贴到DrRacket中。选择“中级”教学语言,然后单击步进按钮。

(define (factorial x)
  (loop x 1))

(define (loop x acc)
  (if (zero? x)
      acc
      (loop (sub1 x) (* x acc))))

(factorial 3)

有关显示步进器的图像,请参阅此问题:Fibonacci in Scheme