方案列表操作程序

时间:2014-03-08 02:44:17

标签: list scheme

我需要创建一个带有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的新手,只是让括号和列表操作挂起。它还在标识符语法错误之后给出了多重表达式。

1 个答案:

答案 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 如何设计程序的副本,以帮助您入门!