【问题标题】:Scheme lisp cons and listScheme lisp 的缺点和列表
【发布时间】:2016-04-06 00:58:39
【问题描述】:

我尝试使用我对 cons,cdr,car 的最基本概念来反转方案中的列表。 这里,l-orig 是要反转的列表,l-count 充当计数器。

我的代码放在这里:

(define (rev l-orig l-count)
(
    if (null? l-count)
    (cons l-orig '())
    (rev (cons (cdr l-orig) (car l-orig)) (cdr l-count))
)
)
(display (rev '(1 2 3 4 5) '(1 1 1 1 1)))

输出是(((2 3 4 5) . 1)) 老实说,我是 lisp 的初学者,在这里我需要一个简单的帮助。 如果我打算使用这种方法,有人可以建议我正确的方法吗?

【问题讨论】:

标签: scheme


【解决方案1】:

您正在尝试在累加器参数的帮助下使用尾递归来反转列表。最好的方法是遍历原始列表和cons累加器头部的每个元素,最后返回:

(define (rev l-orig l-count)
  (if (null? l-orig)
      l-count
      (rev (cdr l-orig) (cons (car l-orig) l-count))))

请注意,累加器从一个空列表开始,非常适合cons向其中添加每个新元素:

(rev '(1 2 3 4 5) '())
=> '(5 4 3 2 1)

【讨论】:

  • 这个解决方案很容易接受。但我的目标是在 l-orig 本身中获得反向列表。我只想使用 l-count 作为计数器。有什么帮助吗?
  • 不要。在 Scheme 中,我们尽量避免修改输入,而是更喜欢构建新的输出,这就是函数式编程方式。
【解决方案2】:

奥斯卡的回答是对的。您可以使用辅助函数,这样您就不需要每次都传入一个空的累加器:

(define (rev xs)
  (rev-accum xs '()))

(define (rev-accum xs accum)
  (if (null? xs)
      accum
      (rev-accum (cdr xs) (cons (car xs) accum))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2012-04-20
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多