Удаление гласных из строки (схема) - PullRequest
1 голос
/ 02 марта 2011

Я знаю основной алгоритм для этой проблемы, но у меня возникают проблемы с изменением предложения в список в моем условном выражении. Я создал make-list, чтобы упростить себе задачу, но я не уверен, куда поместить его в коде. Например, в первом выражении cond мне нужно, чтобы предложение было списком, прежде чем я проверю, является ли первый элемент в предложении гласным, но я делал это синтаксически неправильно.

гласный-ая? возвращает #t, если символ является нечувствительным к регистру гласным, и #f в противном случае.

Стенотип принимает предложение и возвращает его со всеми удаленными гласными.

(define make-list
   (lambda (string)
     (string->list string)))

(define stenotype
  (lambda (sentence)
    (cond
      [(vowel-ci? (car sentence)) (stenotype (cdr sentence))]
      [else (cons (car sentence) (stenotype (cdr sentence)))])))

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Вам нужно преобразовать строку в список только один раз и отфильтровать гласные, используя map или рекурсию.Следующая процедура показывает, как использовать map:

(define (remove-vowels str) 
    (let ((res ()))
      (map (lambda (c) (if (not (vowel? c)) (set! res (append res (list c))))) 
           (string->list str))
      (list->string res)))

Это рекурсивный метод, позволяющий избежать set! и append:

(define (remove-vowels str)
    (let loop ((slist (string->list str)) (res ()))
      (if (not (null? slist))
          (if (vowel-ci? (car slist))
              (loop (cdr slist) res)
              (loop (cdr slist) (cons (car slist) res)))
          (list->string (reverse res)))))

Использование:

> (remove-vowels "hello, world")
"hll, wrld"
> (remove-vowels "goodbye cruel world")
"gdby crl wrld"
2 голосов
/ 02 марта 2011

Есть несколько разных задач (подготовка ввода, чтобы он мог быть обработан вашей реализацией и самой обработкой), которые вы разбили на две разные функции.Следующим шагом является объединение функций, а не переписывание последних для использования первых.Самым простым способом объединения функций является композиция.Составьте make-list и stenotype (вы, возможно, пожелаете назвать эту композицию), и у вас будет свое решение.

(define double
    (lambda (x) (* x 2)))

(define inc
    (lambda (x) (+ x 1)))

; one option: define a new function that's a composition    
(define double-inc
    (lambda (x) (inc (double x))))

; another option: compose the functions when you use them
(inc (double 23))

; yet another option: make the other functions local to the composition
; Useful if the other functions are subordinate to the composition, and 
; aren't useful outside of it. You often see this with recursive functions,
; where the outer function sets up a call to the recursive function
(define (double-inc x)
    (define (double x) (* x 2))
    (define (inc x) (+ x 1))
  (inc (double x)))

(define (max numbers)
    (define (max-recur maximum numbers)
      (cond ((eq? numbers '()) maximum)
            ((< maximum (car numbers)) (max-recur (car numbers) (cdr numbers)))
            (else (max-recur maximum (cdr numbers)))))
  (max-recur (car numbers) (cdr numbers)))

Обратите внимание, что в stenotype отсутствует базовый вариант для завершениярекурсии.

1 голос
/ 02 марта 2011
(define make-list (string)

     (string->list string))

(cond
[(empty? make-list(sentence))empty]
      [(vowel-ci? (car make-list(sentence))) 
        (stenotype list->string ((cdr make-  list(sentence))))]
      [else (cons (car make-list(sentence)) (stenotype (cdr make-list(sentence))))])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...