首页 > 解决方案 > 比较两个列表在方案中是否相同

问题描述

如果 #\tab 之前或 #\space 之前的列表相同,我想比较两个列表返回 true。不一样返回false。这是我尝试做的努力..我尝试使用递归来解决问题,但我不知道我错在哪里..(我不允许使用 equal?我只能使用 char=?)我的代码总是返回假

(same? '(#\H #\e #\l #\l #\o #\tab #\W #\o #\r #\l #\d)
     '(#\H #\e #\l #\l #\o))
    => #t
    (same? '(#\H #\e #\l #\l #\o #\space #\W #\o #\r #\l #\d)
     '(#\W #\o #\r #\l #\d))
    => #f  





     (define same?
(lambda (L1 L2)
(cond
((char=? (car L1) (car L2)) (same? (cdr L1) (cdr L2) ))
((char=? #\space (car L1)) #t)
((char=? #\tab (car L1)) #t)
((char=? #\newline (car L1)) #t)
(else #f)
)))

标签: schemeracket

解决方案


;; Character -> Boolean
;; is char either #\space, #\tab, or #\newline?
(define (space? char)
  (or (char=? char #\space)
      (char=? char #\tab)
      (char=? char #\newline)))

考虑same?函数的所有这些情况:

  • 两者都是L1_L2null
  • L1null并且(car L2)满足space?
  • 既满足(car L1)(car L2)满足space?
  • (car L1)满足space?并且L2null
  • 当两者L1L2既不是null也不是(car L1)和时会发生什么(car L2) spaces?您只需将它们进行比较。如果它们相同 - 重复。如果他们不是 - 返回#false

首先提出具体示例通常会导致这样的模板,从那里完成功能会更容易。然后看看能不能简化。


推荐阅读