有人能向我解释一下递归是如何在以下函数中工作的吗?具体来说,我感兴趣的是,当函数到达其基本情况时会发生什么。此外,为什么在此代码中使用命名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))))))发布于 2013-10-06 17:21:53
所显示的过程并没有什么特别之处,您只是在遍历这个表单的列表:
'((1 . 2) (3 . 4) (5 . 6))唯一“奇怪”的部分是输出正在构建两个列表,而不是通常的单个列表。如您所知,当我们构建单个列表作为输出时,基本情况如下:
(if (null? lst) '() ...)但在这里,考虑到我们同时构建了两个列表,基本情况如下:
(if (null? lst) (cons '() '()) ...)问题中的代码不是使用let,它只是一个普通的花园品种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的优点是它避免了双重递归调用。
https://stackoverflow.com/questions/19211310
复制相似问题