一个方案过程,返回每个其他元素的列表

时间:2012-11-10 01:36:47

标签: scheme

我在Scheme中实现这个程序时遇到了一些麻烦,尽管我认为我有90%的方式。不幸的是,我需要对它有点模糊,因为这是一个家庭作业。  我想(A B C D)返回(B D)。但我得到一个错误,说明对象()作为参数传递给安全车,不是一对 | "  这是我的代码:

(DEFINE (other_el lis)
  (COND
   (( NULL? lis ) '())
   ((LIST? lis)
    (append (CADR lis) (other_el (CDR lis))))
   (ELSE (show " USAGE: (other_el [LIST])"))))

2 个答案:

答案 0 :(得分:2)

这个比你提到的上一个问题简单得多。请记住,您不必计算每一步的长度(可能非常低效),或使用追加操作来解决它(使用cons代替);这是答案的结构,因为它看起来像家庭作业我会让你填补空白:

(define (every-other lst)
  (if (or <???>                    ; if the list is empty 
          <???>)                   ; or the list has a single element
      <???>                        ; then return the empty list
      (cons <???>                  ; otherwise `cons` the second element
            (every-other <???>)))) ; and recursively advance two elements

如果您需要先进行错误检查,请使用其他函数,并在确定参数正确后调用上述步骤:

(define (other_el lst)
  (if (list? lst)
      (every-other lst)
      (error "USAGE: (other_el [LIST])")))

像这样使用:

(other_el '(A B C D E G))
=> '(B D G)

答案 1 :(得分:1)

在演示正确的代码之前,应该提及此代码存在许多小问题。

  1. 不要将程序名称(例如cdr和程序中的定义)大写。
  2. 不要手动显示错误消息。使用例外。
  3. 您应该始终缩进代码。 (编辑:看起来有人编辑了问题的代码以包含缩进)
  4. 无论如何,这是你正在寻找的功能:

    (define (evens lst)
      (if (or (null? lst)             ; if the list is empty 
              (null? (cdr lst)))      ; or the list has a single element
          '()                         ; then return the empty list
          (cons (cadr lst)            ; otherwise `cons` the second element
                (evens (cddr lst))))) ; and recursively advance two elements
    

    我在DrRacket 5.3中测试了该函数,并且(evens'(A B C D))返回'(B D),如您所指定。如果您有任何问题,请告诉我。祝你的作业好运!