计划中的子列表回文

用户名

我有一个工作回文,通过乘坐汽车并将其与倒车进行比较,对于包含原子的单个列表返回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)))
zck

这是您的代码,已正确缩进:

(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我在python回文计划中需要帮助

来自分类Dev

回文计划无效

来自分类Dev

Perl回文计划程序

来自分类Dev

在返回文档的子文档中查找

来自分类Dev

证明可逆列表是Coq中的回文

来自分类Dev

递归检查列表是否是python中的回文

来自分类Dev

Optaplanner:一个计划实体中的计划变量列表?

来自分类Dev

字符串中回文子序列的总数

来自分类Dev

在Perl子例程中返回文件句柄

来自分类Dev

如何在mongo中过滤子数组并返回文档

来自分类Dev

子方法中的 if 语句返回文本错误

来自分类Dev

如何在Java中检查链接列表是否为回文?

来自分类Dev

字符串列表中的回文模式匹配

来自分类Dev

创建回文计划时出现逻辑错误

来自分类Dev

欧拉计划-最大的回文产品

来自分类Dev

回文计划的输出超出范围

来自分类Dev

原始回文计划进入无限循环

来自分类Dev

欧拉计划-最大的回文产品

来自分类Dev

欧拉计划-最大回文#4 Python

来自分类Dev

在python的子列表中创建子列表

来自分类Dev

从单词列表构建回文

来自分类Dev

回文链接列表

来自分类Dev

计划功能,用于计算列表中的原子元素

来自分类Dev

在R中的列表中查找子列表

来自分类Dev

子手计划

来自分类Dev

找到最长的回文子串

来自分类Dev

在子子列表中查找元素的索引

来自分类Dev

计数子列表中的出现

来自分类Dev

忽略css中的子列表