比较两个列表是否相同

时间:2019-04-06 00:18:37

标签: scheme racket

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

(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)
)))

2 个答案:

答案 0 :(得分:1)

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

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

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

首先提出具体示例通常会导致产生此类模板,从那里可以更轻松地完成功能。然后看看是否可以简化。

答案 1 :(得分:-2)

我这样设定您的病情:

  1. 两个字符列表必须具有#\ space或#\ tab,否则将失败。

  2. 比较#\ space或#\ tab之前的部分。

对吗?

#lang racket

(define (same? l1 l2)
  (let loop ([loop_l1 l1]
             [loop_l2 l2]
             [result #f])
    (if (and
         (not (null? loop_l1))
         (not (null? loop_l2)))
        (if
         (or
           (char=? (car loop_l1) #\tab)
           (char=? (car loop_l1) #\space)
           (char=? (car loop_l2) #\tab)
           (char=? (car loop_l2) #\space))
         result
         (if (char=? (car loop_l1) (car loop_l2))
             (loop (cdr loop_l1) (cdr loop_l2) #t)
             #f))
        #f)))

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

(same? 
 '(#\H #\e #\l #\l #\o #\tab #\W #\o #\r #\l #\d)
 '(#\H #\e #\l #\l #\o))
;; #f

(same? 
 '(#\H #\e #\l #\l #\o)
 '(#\H #\e #\l #\l #\o #\tab #\W #\o #\r #\l #\d))
;; #f

(same? 
 '(#\H #\e #\l #\l #\o)
 '(#\H #\e #\l #\l #\o))
;; #f

(same? 
 '(#\H #\e #\l #\l #\o #\tab #\W #\o #\r #\l #\d)
 '(#\H #\e #\l #\l))
;; #f