如果#\ 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)
)))
答案 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?
函数的所有这些情况:
L1
和L2
均为null
L1
是null
,(car L2)
满足space?
(car L1)
和(car L2)
都满足space?
(car L1)
满足space?
并且L2
是null
L1
和L2
既不是null
也不是(car L1)
和(car L2)
spaces
时会发生什么?您只需将它们进行比较。如果它们相同,请重复。如果不是,请返回#false
首先提出具体示例通常会导致产生此类模板,从那里可以更轻松地完成功能。然后看看是否可以简化。
答案 1 :(得分:-2)
我这样设定您的病情:
两个字符列表必须具有#\ space或#\ tab,否则将失败。
比较#\ 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