2011-04-22 50 views
1

問題
計算列表中出現的次數,它們必須相鄰。例如:(a a b b c c a e),返回 ((a 2) (b 2) (c 2) (a 1) (e 1))如何在Scheme中使用多個語句循環?

我試過,

(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循環像這裏面的多條語句?

謝謝,

+2

-1我的眼睛!護目鏡什麼都不做! – 2011-04-22 06:33:26

+0

@Chris Jester-Young:我不明白嗎? – Chan 2011-04-22 06:34:53

+0

你想做什麼?這看起來不像Schemer會或者應該想要編寫的任何代碼。 – 2011-04-22 06:36:37

回答

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的列表),你可以使用foldr代替fold-right;這樣,你就不需要加載SRFI 1.我的眼睛!

+0

@Chris Jester-Young:現在,你傷害了我的眼睛。謝謝! – Chan 2011-04-22 06:47:13

+0

@Chan:哈哈哈。通過閱讀'foldr'如何工作,盡你所能研究我的功能是如何工作的。它會啓發你! :-) – 2011-04-22 06:48:06

+0

@Chris Jester-Young:嗯,我很熟悉fold的意思。我從wiki中讀到,它類似於C++中的'std :: accumulate'。不過,'()'超級煩人:(! – Chan 2011-04-22 06:50:12