2014-04-22 78 views
0

我試圖找到一個列表方案模式功能

假設列表的方式進行排序升序排列

這裏是我的模式功能

(define freq 
    (lambda (l) 
    (cond ((null? l)l) 
      ((null? (cdr l))l) 
      ((not(equal? (car l) (car(cdr l))))(freq(cdr(delete l (car l))))) 
      (else (freq (cdr l))) 
))) 

    (freq '(4 4 4 4 5 7 9 9 9)) => should returns 4 but its returning 9 instead 

回答

2

這裏是我的解決方案,這是類似奧斯卡的解決方案,但集中了最長/獲獎結果的更新在一個地方:

(define (longest-run lst) 
    (let loop ((result #f) 
      (cur #f) 
      (count 0) 
      (longest 0) 
      (lst lst)) 
    (cond ((> count longest) 
      (loop cur cur count count lst)) 
      ((null? lst) result) 
      ((eqv? (car lst) cur) 
      (loop result cur (+ count 1) longest (cdr lst))) 
      (else 
      (loop result (car lst) 1 longest (cdr lst)))))) 

我覺得我的解決方案更短,更清潔,少重複,但奧斯卡解決方案具有更少更新變量的優點:他的解決方案只在運行結束時更新變量,而當我的當前長度超​​過迄今爲止所見的最長長度時,我會更新變量。

+1

+1更清潔,確實更短! –

2

什麼是你的程序背後的邏輯是什麼?你如何期望它通過從輸入列表中刪除元素來找到mode?你應該計數頻率,而不是:

(define (mode lst) 
    (if (null? lst) 
     #f ; edge case: an empty list doesn't have a mode 
     (let loop ((lst lst) ; list to traverse 
       (current (car lst)) ; current element in sequence 
       (counter 0) ; number of times current element appears 
       (max-current (car lst)) ; the mode 
       (max-counter 0)) ; number of times the mode appears 
     (cond ((null? lst) ; the list is finished 
       (if (> counter max-counter) current max-current)) 
       ((= (car lst) current) ; current element equal to previous 
       (loop (cdr lst) ; add 1 to counter and keep iterating 
        current 
        (add1 counter) 
        max-current 
        max-counter)) 
       (else ; found a different element, a new sequence starts 
       (loop (cdr lst) 
        (car lst) ; update current element 
        1 
        (if (> counter max-counter) current max-current) 
        (max counter max-counter))))))) 

它通過保持的每一個元素出現了多少次軌道,返回出現最頻繁的元素 - 因爲根據定義的模式是最經常出現的一組值數據的。我們利用輸入列表被排序的事實,因爲我們知道當前元素與我們遇到的前一個元素不同時,會開始一個新的重複元素序列。

+0

洛佩茲我如何獲得元素?例如:'(4 4 4 4 4 5 7 9 9 9)我希望它返回4 – user3100209

+0

Lopez'(4 4 4 4 4 5 6 9 9 9)我希望這個返回4 – user3100209

+0

@ user3100209我重寫了我的回答是,原始程序中存在一個錯誤。看到說明 –