Как использовать несколько операторов внутри цикла do в Scheme? - PullRequest
1 голос
/ 22 апреля 2011

Проблема
Подсчитать число вхождений в списке, они должны быть смежными.Пример: (a a b b c c a e), возвращает ( (a 2) (b 2) (c 2) (a 1) (e 1) ).

Я пытался,

(define (loop lst) 
  (let ((i 1) (j 0))
    (do ()
      [(> j (- (length lst) 2))]
      (if (eq? (car lst) (cadr lst))
          (set! i (+ i 1))
          (display i)
      )
      (
         (set! lst (cdr lst))
         (set! j (+ j 1))
      )
    )
  )
)

Во время работы DrScheme жаловался

procedure application: expected procedure, given: #<void>; arguments were: #<void>

Как использовать несколько операторов внутриif или do петля, как это?

Спасибо,

1 Ответ

2 голосов
/ 22 апреля 2011

О, вы хотите вычислить длины пробега!Угадай, что!Еще одна проблема для fold!: -P

(define (run-lengths lst)
  (fold-right (lambda (elem result)
                (if (and (pair? result)
                         (equal? elem (caar result)))
                    (cons (cons elem (+ (cdar result) 1)) (cdr result))
                    (cons (cons elem 1) result)))
              '() lst))

(Моя версия возвращает длины серий в виде точечных пар, а не списков длины 2.) Поскольку вы используете Racket, вы можете использовать foldr вместо fold-right;Таким образом, вам не нужно загружать SRFI 1.

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