我想比较两个列表,如果#\ tab之前或#\ space之前的列表是相同的返回true。不一样的回报是假的。这是我尝试的努力..我尝试使用递归来解决问题,但我不知道我错在哪里..(我不允许使用相同的?我只能使用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)
)))
;; 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
首先提出具体的例子通常会导致像这样的模板,从那里更容易完成功能。然后看看你是否可以简化。
我这样设定你的条件:
对?
#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