Рефакторинг списков - PullRequest
       1

Рефакторинг списков

1 голос
/ 01 ноября 2011

Я хочу взять список со строками и числами, такими как

'("Ben" 95 99 100 -1 "Bob" 90 40 66 -5 "Jerry" 95 90 0) 

и вернуть список со всеми удаленными отрицательными числами, а имя и его последующие числовые значения помещаются в списокв этом списке - для моего примера, требуемое возвращаемое значение будет

(("Ben 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0))

Я не могу получить его, чтобы поместить скобки в нужных местах, и мне интересно, как это можно сделать.Кто-нибудь может помочь?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Попробуйте это:

(define (refactor lst acc)
  (cond ((empty? lst) (list acc))
        ((and (number? (first lst)) (< (first lst) 0))
         (cons acc (refactor (rest lst) '())))
        (else (refactor (rest lst) (append acc (list (first lst)))))))

При тестировании с предоставленным примером ввода:

(define lst '("Ben" 95 99 100 -1 "Bob" 90 40 66 -5 "Jerry" 95 90 0))
(refactor lst '())

Возвращаемое значение соответствует ожидаемому:

(("Ben" 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0))
0 голосов
/ 19 июля 2012

Жаль, я не могу комментировать ответ Оскара. Он разделяет список отрицательными числами вместо строк, поэтому он приводит к ошибке, как показано ниже (протестировано в схеме Petite Chez, заменяя first-> car, rest-> cdr, empty? -> null? В случае неправильного понимания ключевых слов ):

> (refactor '("Ben" 95 99 100 -1 "Bob" 90 -7 40 66 -5 "Jerry" 95 -5 90 0) '())
(("Ben" 95 99 100) ("Bob" 90) (40 66) ("Jerry" 95) (90 0))

Вот одно из решений. acc - это текущий подсписок, который начинается с последнего слова, после которого идут неотрицательные числа перед тем, как прикоснуться к следующему слову.

(define (refactor lst acc)
   (cond ((null? lst) (list acc))
         ((and (not (number? (car lst))) (null? acc))
          (refactor (cdr lst) (list (car lst))))
         ((and (not (number? (car lst))) (not (null? acc)))
          (cons acc (refactor (cdr lst) (list (car lst)))))
         ((and (number? (car lst)) (< (car lst) 0)
          (refactor (cdr lst) acc)))
         (else (refactor (cdr lst) (append acc (list (car lst)))))))

Проверено, как показано ниже:

> (refactor '("Ben" 95 99 100 -1 "Bob" 90 -7 40 66 -5 "Jerry" 95 -5 90 0) '())
(("Ben" 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0))
> (refactor '("Ben" 95 99 100 -1 "Bob" 90 40 66 -5 "Jerry" 95 90 0) '())
(("Ben" 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0))
> (refactor '("Ben" 95 99 100 -1 "Bob" "Jerry" 95 90 0) '())
(("Ben" 95 99 100) ("Bob") ("Jerry" 95 90 0))
> (refactor '(-10 "Ben" -1 "Bob" -5 "Jerry" 0) '())
(("Ben") ("Bob") ("Jerry" 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...