Схема Строка Справка - PullRequest
1 голос
/ 26 сентября 2010

Я пытаюсь написать функцию, которая оценивает количество различных символов во входной строке str.Так, например, (distinct-char "eeeiicczz") вернет 4. Мне нужна помощь с моим кодом.Это то, что у меня есть.

(define string-contains
  (lambda (str char)
    (if (equal? str "")
        #f
        (if (char=? (string-ref str 0) char)
            #t
            (if (not (char=? (string-ref str 0) char))
                (string-contains (substring str 1 (string-length str)) char))))))

(define unique-chars
  (lambda (str)
    (cond
      ((equal? str "") "")
      ((equal? (string-length str) 1) (string-ref str 0))
      (else
      (if (equal? (string-contains (substring str 1 (string-length str)) (string-ref str 0)) #t)
          (unique-chars (substring str 1 (string-length str)))
          (string-append (substring str 0 1) (substring str 1 (string-length str))))))))

(define distinct-char
  (lambda (str)
    (string-length (unique-chars str))))

Я ограничен использованием следующих встроенных функций:

(if x y z), (cond ...),  
(read)  
(string-length x)  
(string-ref str x)  
(substring x y) 
(string-append x y)  
(equal? x y), (char=?)  
(remainder x y), (quotient x y)  
(max ...), (min ...)  
(+ x y), (- x y), (* x y), (/ x y)  
(> x y), (< x y), (<= x y), (>= x y) 
(and x y), (or x y), (not x y)  

Ответы [ 3 ]

3 голосов
/ 26 сентября 2010

Поскольку можно преобразовать строку в список, было бы намного проще сделать это и использовать встроенные функции списка.(Примечание: следующий код находится в Racket. Поскольку это в значительной степени схема, я предполагаю, что эти функции существуют. Если они не проверяют ваши документы на что-то подобное)шаблон, который вы можете заполнить. Замените комментарии тем, что, по вашему мнению, должно происходить в каждой ситуации.Удачи!

(define (empty-string? str) 
  ( #| What property does an empty string have? Add a simple boolean expression here. |# )

 (define (char-exists? str char)
  (cond
    [(empty-string? str) ( #| If the string is empty, does the character exist? |# )]
    [else ( #| Check the first character in the string. If it is what we're looking for
               we're done! If it's not call this function on the rest of the string. |# )]))

(define (unique-chars str)
  (cond
    [(empty-string? str) ( #| What should you return if the string is empty? |# )]
    [(equal? (string-length str) 1) ( #| What should you return if the string is one character long? |# )]
    [else ( #| If the character at the beginning of the string exists in the rest of the string, ignore it
               and preform recursion on the rest of the string. If it doesn't, append the character to
               the result of this function on the rest of the string. |# )]))

(define (distinct-char str)
  (string-length (unique-chars str)))
1 голос
/ 26 сентября 2010

Одна из причин, по которой вы изучаете материал в схеме, заключается в том, что он обучает вас самим создавать полезные строительные блоки, а затем соединять эти строительные блоки.

В этом случае общий подход, который я бы рекомендовал, заключается внаписать функцию:

(string-contains str ch)

, которая возвращает #t или #f в зависимости от того, содержит ли str символ ch, и затем использовать ее для определения функции:

(unique-chars str)

, который возвращает строку уникальных символов в str (вы сканируете str, выстраиваете свой ответ и в каждой точке видите, находится ли следующий символ в строке ответа, которую вы строите, иесли нет, добавьте его в строку ответа).

Тогда вам нужна только функция

(string-length (unique-chars str))
0 голосов
/ 26 сентября 2010

Вы можете хранить и передавать список всех отдельных персонажей, с которыми вы сталкивались ранее. Таким образом, каждый раз, когда вы проверяете нового персонажа, вы просматриваете его в своем списке, чтобы увидеть, видели ли вы его уже раньше. Если его нет в вашем списке, значит это новый персонаж, и вы можете добавить его в свой список.

Вопрос по домашнему заданию, поэтому я не пишу код в ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...