我需要创建一个带有2个变量的程序,例如一个列表,例如L1
= (1 2 3 4 5 6)
和一个例如x
= 2
将列表中的第一个x
个项目放入新列表中的位置,例如L2
= (1 2)
并输出两个列表:
(define split(lambda (list L1) x)
(if(> x 0)
(- x 1)
(list L2(car(L1)))
(cdr L1))
(L1
L2))
我是Scheme的新手,只是让括号和列表操作挂起。它还在标识符语法错误之后给出了多重表达式。
答案 0 :(得分:3)
您的解决方案中存在许多语法错误,如果我向您展示正确的版本并解释问题,则会更简单。对于初学者来说,如果我们在两个过程中分解问题,这将更容易实现:
split-aux
返回x
中的第一个L1
元素。请注意,这与某些解释器中的take
函数相同split
是“main”函数,它返回一个两元素列表:第一个元素是L1
(原始列表),第二个元素是拆分L1
的结果您的代码中需要修复的一些事项:
(L1 x)
x
大于零,您必须通过调用我们正在定义的程序提前递归cons
将新元素组合在一起这就是我的意思:
(define split
(lambda (L1 x)
(list L1 (split-aux L1 x))))
(define split-aux
(lambda (L1 x)
(if (> x 0)
(cons (car L1) (split-aux (cdr L1) (- x 1)))
'())))
测试它,它按预期工作:
(split '(1 2 3 4 5) 2)
=> '((1 2 3 4 5) (1 2))
我建议您选择一本书来教您基本知识和思考Scheme中解决方案的正确方法。获取 The Little Schemer 或如何设计程序的副本,以帮助您入门!