0

有人可以向我解释递归如何在以下函数中工作吗?具体来说,我对函数达到其基本情况时会发生什么感兴趣。另外,为什么在这段代码中使用了一个命名的 let?(我不熟悉命名的让)

(define (unzip list-of-pairs)
  (if (null? list-of-pairs)
   (cons '() '())
   (let ((unzipped (unzip (cdr list-of-pairs))))
         (cons (cons (car (car list-of-pairs)) (car unzipped))
               (cons (cdr (car list-of-pairs)) (cdr unzipped))))))
4

1 回答 1

1

显示的过程没有任何特别之处,您只是在遍历此表单的列表:

'((1 . 2) (3 . 4) (5 . 6))

唯一“奇怪”的部分是输出正在构建两个列表,而不是通常的单个列表。如您所知,当我们构建单个列表作为输出时,基本情况是这样的:

(if (null? lst) '() ...)

但是在这里,鉴于我们同时构建了两个列表,基本情况如下所示:

(if (null? lst) (cons '() '()) ...)

问题中的代码没有使用namedlet,它只是一个普通的老花园品种let,没有什么特别之处。它很有用,因为我们只想调用一次递归,因为我们需要从递归调用中获取两个值。

如果我们不介意效率低下,可以不使用 来编写过程let,但代价是在每一步调用递归两次:

(define (unzip list-of-pairs)
  (if (null? list-of-pairs)
      (cons '() '())
      (cons (cons (car (car list-of-pairs))
                  (car (unzip (cdr list-of-pairs))))
            (cons (cdr (car list-of-pairs))
                  (cdr (unzip (cdr list-of-pairs)))))))

当然,使用的好处let是避免了双重递归调用。

于 2013-10-06T17:21:53.037 回答