这个计数偶数球拍功能是如何工作的?

How does this count-even racket function work?

我正在尝试了解课本中给出的偶数函数是如何工作的,但我不确定我是否完全理解它。

我在代码旁边的注释中提供了我对该函数的理解。谁能解释一下这个函数的每一步发生了什么并纠正我。

而且我不明白这个函数是如何递归的。基本情况是什么?

(define (ce x)           ; x is an argument that takes in a list
 (if (pair? x)                    ; I don't understand why this is here
  (+ (ce (car x))        ; Add the resuls of recursive call together (0 or 1)
     (ce (cdr x)))
  (if (and (number? x) (even? x)) ; if x is a number and x is even then return 1 ? Else return 0 ?
      1
      0) ) )

在递归函数中通常有两种情况:

  1. 结果是对同一函数的调用
  2. 结果是一个简单的值,基本情况

您可以在 if 的两种情况之间进行选择。

因此基本情况是:

(if (and (number? x) (even? x))
    1
    0) ) )

递归情况是:

  (+ (count-evens (car x))        
     (count-evens (cdr x)))

评论:

  1. 参数x不需要是一个列表。 pairs? 测试列表。如果它只是一个值,那么我们就有了基本情况。如果是偶数,则结果为 1,否则为 0。
  2. 如果参数x是一个列表,我们将它分成两部分,头部(car)和尾部(cdr)。 head 只是一个值,因此当我们在其上重新运行 count-evens 时,我们最终得到基本情况。
  3. 尾部被传递给 count-evens,它会一次切掉一个值,直到我们在 car 中有一个值,在 cdr 中有一个空列表。在基本情况下,第一个值评估为偶数,空列表始终评估为零。