我有一个工作回文,通过乘坐汽车并将其与倒车进行比较,对于包含原子的单个列表返回true / false。然后,它使用cdr(反向(cdr列表))丢弃第一个和最后一个。
我想使其与子列表中的原子一起使用,以便'(ab)c(ba))将返回true。
我正在尝试让它首先检查car是否在列表中,如果是,则比较caar和反向caar直到它为空,然后继续。
我收到“对象#f不适用”。
(DEFINE (pdrome lst)
(cond
; ((NOT (LIST? lst)) DISPLAY "USAGE: (palindrome [list])" )
((null? lst) #t)
((null? (cdr lst)) #t)
((LIST? (car lst))
((null? (car lst) ) () )
((null? (cdr lst) ) () )
((equal? (caar lst) (caar (reverse lst)))
(pdrome (cdar (reverse(cdar lst))))))
((equal? (car lst) (car(reverse lst)))
(pdrome (cdr (reverse (cdr lst)))))
(else #F) ) )
我也尝试过这样做,这样就不会嵌套,但我无法弄清楚。任何提示或提示表示赞赏。谢谢!
(LIST? car lst)
palindrome (append (caar lst) (caar (reverse lst)))
这是您的代码,已正确缩进:
(DEFINE (pdrome lst)
(cond
((null? lst) #t)
((null? (cdr lst)) #t)
((LIST? (car lst))
((null? (car lst))())
((null? (cdr lst))())
((equal? (caar lst) (caar (reverse lst)))
(pdrome (cdar (reverse(cdar lst))))))
((equal? (car lst) (car(reverse lst)))
(pdrome (cdr (reverse (cdr lst)))))
(else #F)))
注意第三个子句在什么时候不应该结束吗?或者,也许您正在尝试先检查几个条件(equal? (caar lst) (caar (reverse lst)))
。
当您调用时(pdrome '((a b) c (b a)))
,它将到达(LIST? (car lst))
true的地步,因此它将评估该子句中的其余代码。那是:
((null? (car lst))())
((null? (cdr lst))())
((equal? (caar lst) (caar (reverse lst))
让我们来看第一个:((null? (car lst))())
。如何评估?这是一个包含两个元素的列表,因此请评估第一个:(null? (car lst))
。评估为#F
。然后,我们有(#F ())
。#F
处于功能位置(列表中第一件事被评估为代码),但不是功能。所以我们得到了错误Object #f is not applicable
。
基本上,cond的每个子句如下所示:
(condition form1 form2 ...)
可以有多种形式,包括零种。
因此,让我们看一下您的单个子句
((LIST? (car lst))
((null? (car lst))())
((null? (cdr lst))())
((equal? (caar lst) (caar (reverse lst)))
(pdrome (cdar (reverse(cdar lst))))))
条件如下:
(LIST? (car lst))
这是表格。其中有三个:
((null? (car lst))())
((null? (cdr lst))())
((equal? (caar lst) (caar (reverse lst)))
(pdrome (cdar (reverse(cdar lst))))))
如果条件为真(即(car lst)
本身就是列表),那么您想做什么?
我要退后一会儿,按照我将要手工进行的方法来设计算法。
在没有列表之前,先切掉第一件事,最后一件事,然后看看第一件事和最后一件事是否相同。如果这些东西本身是列表,则逆转最后一个。然后继续在列表中间(即没有第一个或最后一个元素的列表)上执行此操作,直到我们得到一个空列表或其中仅包含一件事的列表。
现在让我们写一些代码:
(define (palindrome lst)
(if (null? lst)
#t
(let ((first-element (car lst))
(last-element (car (reverse lst))))
(and (equal? first-element
(if (list? last-element)
(reverse last-element)
last-element))
(palindrome (get-middle lst))))))
(define (get-middle lst)
(if (null? (cdr lst))
'()
(reverse (cdr (reverse (cdr lst))))))
> (palindrome '())
#t
> (palindrome '(a))
#t
> (palindrome '((a)))
#t
> (palindrome '((a) b))
#f
> (palindrome '((a) b (a)))
#t
> (palindrome '((a b) c (b a)))
#t
请注意,此代码与书面算法略有不同。当它到达一个带有一个元素的列表时(例如,它被称为(palindrome '(a))
,它将得到第一个元素'a
,最后一个元素'a
,确保它们相等,然后调用(get-middle '(a))
,即'()
,然后(palindrome '())
是#f
,所以我们很好。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句