сравнить два списка одинаковы или нет в схеме - PullRequest
0 голосов
/ 06 апреля 2019

Я хочу сравнить два списка, если список перед # \ tab или перед # \ space одинаков, и возвращает true. не то же самое возвращение ложного. Вот усилия, которые я пытаюсь сделать .. Я пытаюсь использовать рекурсию для решения проблемы, но я не знаю, где я ошибаюсь ... (мне не разрешено использовать равные? Я могу использовать только 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 ]

1 голос
/ 06 апреля 2019
;; 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

Приступая к конкретным примерам, обычно начинаются с таких шаблонов, оттуда проще выполнить функцию. Тогда посмотри, сможешь ли ты упростить.

0 голосов
/ 06 апреля 2019

Я установил ваше состояние следующим образом:

  1. список из двух символов должен иметь # # пробел или # \ табуляцию, или произошел сбой.

  2. сравните деталь перед # \ пробелом или # \ табуляцией.

верно?

#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
...