如何在Scheme中使用多个语句进行循环?

时间:2011-04-22 06:30:02

标签: scheme

问题
计算列表中的数字出现次数,它们必须相邻。例如:(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>

如何在ifdo循环中使用多个语句?

谢谢,

1 个答案:

答案 0 :(得分:2)

哦,你想计算跑步长度!你猜怎么着! 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.