这是正确的反向方法吗?我想创建一个“oddrev”函数,从下面的列表中执行此操作:
(DEFINE list0 (LIST 'j 'k 'l 'm 'n 'o 'j) )
(DEFINE list1 (LIST 'a 'b 'c 'd 'e 'f 'g) )
(DEFINE list2 (LIST 's 't 'u 'v 'w 'x 'y 'z) )
(DEFINE list3 (LIST 'j 'k 'l 'm 'l 'k 'j) )
(DEFINE list4 (LIST 'n 'o 'p 'q 'q 'p 'o 'n) )
(DEFINE list5 '( (a b) c (d e d) c (a b) ) )
(DEFINE list6 '( (h i) (j k) l (m n) ) )
(DEFINE list7 (f (a b) c (d e d) (b a) f) )
(oddrev '(a b c d e f g))
会/应该返回:
(g e c a)
(oddrev (LIST 's 't 'u 'v 'w 'x 'y 'z))
会/应该返回:
(y w u s)
(oddrev '((h i) (j k) l (m n)))
会/应该返回:
(l (h i))
和
(oddrev '())
会/应该返回空列表等。
这段代码看起来正确吗?如何将reverse命令合并到其中:
(define mylist '(1 2 3 4 5 6 7))
(define (oddrev lst)
(define (do-oddrev lst odd)
(if (null? lst)
lst
(if even
(do-oddrev (cdr lst) #f)
(reverse (cons (car lst) (do-oddrev (cdr lst) #t))))))
(do-evens lst #f))
或者我应该做些什么:
(define (oddrev 1st)
(if (NULL? 1st) '()
(append (reverse (cdr 1st)) (list (car 1st)))))
最佳答案
最简单的方法是建立一个(oddrev-lis)过程来获取列表的奇数元素,然后建立一个(oddrev-lis)过程来调用奇数过程,并对其结果应用相反的过程。
奇怪的程序应该是这样的:
(define (odd lis)
(if (null? lis)
'()
(if (= (length lis) 1)
(list (car lis))
(cons (car lis) (odd (cddr lis))))))
既然如此,我们现在必须定义oddrev这部分很简单,就叫奇数,然后倒过来,就像这样:
(define (oddrev lis)
(reverse (odd lis))
我在Drracket5.3中对此进行了测试,以确保其工作正常,并且结果完全符合您问题中概述的规范如果你对代码有任何问题,请告诉我。
关于lisp - 返回的计划程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13372318/