Scheme 返回所有其他元素列表的方案过程

Scheme 返回所有其他元素列表的方案过程,scheme,Scheme,我在Scheme中执行这个程序时遇到了一些问题,尽管我认为我已经完成了90%。不幸的是,我需要有点含糊不清,因为这是一个家庭作业。 我想(abcd)返回(bd)。但是我得到一个错误,它说作为参数传递给safe car的object()不是一对 | " 这是我的代码: (DEFINE (other_el lis) (COND (( NULL? lis ) '()) ((LIST? lis) (append (CADR lis) (other_el (CDR lis))))

我在Scheme中执行这个程序时遇到了一些问题,尽管我认为我已经完成了90%。不幸的是,我需要有点含糊不清,因为这是一个家庭作业。 我想(abcd)返回(bd)。但是我得到一个错误,它说作为参数传递给safe car的object()不是一对 | " 这是我的代码:

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

在我演示正确的代码之前,应该先提到该代码的一些小问题

  • 不要在Scheme中大写过程的名称,如cdr和define
  • 不要手动显示错误消息。请使用异常
  • 你应该总是缩进你的代码。(编辑:看起来有人编辑了问题的代码以包含缩进)
  • 无论如何,以下是您正在寻找的函数:

    (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))returns'(B D)中测试了该函数。如果您有任何问题,请告诉我。祝您的家庭作业顺利!

    这个问题比您之前问的问题简单得多。请记住,您不必计算每一步的长度(这可能效率很低),或使用附加操作来解决它(改为使用
    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
    
    像这样使用它:

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

    当用户输入的参数不是“列表”时,我希望能够打印特定的错误消息“而不是让口译员来做。我试着按照你的逻辑去做,但我迷路了:)提前谢谢,包含你自己的错误消息的最好方法是对列表进行另一个函数检查,并进行错误处理,然后调用我给你的函数(即奥斯卡在回答中使用的技巧)。这是一个糟糕的答案,解决方案很容易就是
    O(n)
    (请参阅),但是在条件中使用
    长度
    使其成为
    O(n^2)
    。您不应该在每次迭代时检查列表的长度,谢谢,我将代码更改为您在实现中提供的代码(我会直接删除我的答案,但不幸的是它已经被接受)。是否有语法来检查列表是否有单个元素,就像我们检查空列表的方式(null?lst)一样?对不起,如果这太基本了,我对这门语言还是新手。谷歌情不自禁:)@NathalieD当然。只需检查当前元素之后的下一个元素是否为空列表:
    (null?(cdrlst))
    您熟悉函数
    cddr
    (other_el '(A B C D E G))
    => '(B D G)