A scheme procedure that returns a list of every other element

三世轮回 提交于 2019-12-02 01:19:40

问题


I'm having a bit of trouble implementing this program in Scheme, although I think I'm 90% of the way there. Unfortunately I need to be a little vague about it since this is a homework assignment. I want to (A B C D ) to return ( B D) . but i am getting an error that says The object (), passed as an argument to safe-car, is not a pair | " This is my code:

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

回答1:


There are a number of minor issues with this code that should be mentioned before I demonstrate the proper code.

  1. Do not capitalize procedures' names such as cdr and define in Scheme.
  2. Do not display an error message manually. Use exceptions.
  3. You should always indent your code. (edit: it looks like someone has edited the question's code to include indentation)

Anyway, here is the function you are looking for:

(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

I tested the function in DrRacket 5.3 and (evens '(A B C D)) returns '(B D), as you specified. If you have any trouble, let me know. Good luck with your homework!




回答2:


This one is considerably simpler than the previous question you asked. Bear in mind, you don't have to calculate the length at each step (that could be very inefficient), or use append operations to solve it (use a cons instead); here's the structure of the answer, because it looks like homework I'l let you fill-in the blanks:

(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

If you need to do some error checking first, use another function and call the above procedure after you're certain that the arguments are correct:

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

Use it like this:

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


来源:https://stackoverflow.com/questions/13318388/a-scheme-procedure-that-returns-a-list-of-every-other-element

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!