gpt4 book ai didi

scheme - 将列表分成两部分 - 一个包含第二个元素,另一个包含所有其余元素

转载 作者:行者123 更新时间:2023-12-04 23:53:12 24 4
gpt4 key购买 nike

我正在写一个递归函数(split L)获取列表 L,并返回一个新列表包含两个子列表,第一个子列表包含 L 中每隔一个元素第二个列表包含不在第一个子列表中的剩余元素。

在这里是如何的例子 split 应该工作:

(split ‘(1 2 3 4 5 6 7 8) )  ( (1 3 5 7) (2 4 6 8))
(split ‘(cat bird dog horse mouse pig tiger gerbil cow) )
( (cat dog mouse tiger cow) (bird horse pig gerbil))

现在这是我的尝试:

(define split
(lambda (L)
(if
(null? L)
'()
(list (first L) (second L))
)
)
)

(define first
(lambda (L)
(if
(null? L)
'()
(cond
(
(null? (cdr L))
(car L)
)
(
#t
(cons
(car L)
(first (cdr (cdr L)))
)
)
)
)
)
)

(define second
(lambda (L)
(if
(null? L)
'()
)
(cond
(
(null? (cdr L))
'()
)
(cons
(car (cdr L))
(second (cdr (cdr L)))
)
)
)
)

但我得到的不是预期的结果:

对于 (split '(1234)) 我得到 ((1234)())
对于 (first '(1234)),我得到 (1234)
对于 (second '(1234)),我得到 ()

最佳答案

一些需要考虑的事情:

  • 你有括号问题
  • cond 的最后一个条件中,您应该使用 else
  • 不需要先用if再用cond,把所有的条件都放在一个cond里,就可以生成代码了更清晰
  • first中的基本情况是错误的,你必须返回一个列表
  • split 中,您应该使用 list 来构建返回的列表,而不是 cons
  • 您真的,真的应该改进代码的格式 - 括号不应该单独留在一行中,它们不像其他编程语言中的 {} 括号 - 这将提高代码的可读性

考虑到上述情况,这里有一个解决所有问题的实现:

(define split
(lambda (L)
(if (null? L)
'()
(list (first L) (second L)))))

(define first
(lambda (L)
(cond ((null? L) '())
((null? (cdr L)) L)
(else (cons (car L)
(first (cdr (cdr L))))))))

(define second
(lambda (L)
(cond ((null? L) '())
((null? (cdr L)) '())
(else (cons (car (cdr L))
(second (cdr (cdr L))))))))

现在它按预期工作了:

(split '(1 2 3 4 5 6 7 8))
=> '((1 3 5 7) (2 4 6 8))

(split '(cat bird dog horse mouse pig tiger gerbil cow))
=> '((cat dog mouse tiger cow) (bird horse pig gerbil))

关于scheme - 将列表分成两部分 - 一个包含第二个元素,另一个包含所有其余元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23697182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com