首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >car和cdr递归

car和cdr递归
EN

Stack Overflow用户
提问于 2013-10-06 16:46:40
回答 1查看 1.1K关注 0票数 0

有人能向我解释一下递归是如何在以下函数中工作的吗?具体来说,我感兴趣的是,当函数到达其基本情况时会发生什么。此外,为什么在此代码中使用命名let?(我不熟悉有名无实的小编)

代码语言:javascript
复制
(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))))))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-06 17:21:53

所显示的过程并没有什么特别之处,您只是在遍历这个表单的列表:

代码语言:javascript
复制
'((1 . 2) (3 . 4) (5 . 6))

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

代码语言:javascript
复制
(if (null? lst) '() ...)

但在这里,考虑到我们同时构建了两个列表,基本情况如下:

代码语言:javascript
复制
(if (null? lst) (cons '() '()) ...)

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

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

代码语言:javascript
复制
(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的优点是它避免了双重递归调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19211310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档