2010-11-11 166 views
1

我試圖計算列表中正數元素的數量。這是我到目前爲止:計算列表中的正數元素

(define howMany 
    (lambda (list) 
     (cond 
     [(not (list? list)) 0] 
     [(null? list) 0] 
     [(> list 0) (+ 1 (howMany (cdr list)))]))) 

它不斷給我一個錯誤,「預計類型實數」,你會如何解決這個問題?

哦即時調用此像這樣:

(howMany '(6 7 8)) 
+1

當然,你的意思是計劃,而不是架構? – 2010-11-11 21:06:36

回答

0

代碼中有幾個錯誤。

(> list 0)(> (car list) 0)如要檢查列表的第一要素大於0不能的>默認實現應用到列表無論是。

(+ 1 (howMany (cdr list)))也將失敗,因爲howMany並不總是評估一個數字。您必須通過將該參數作爲遞歸調用過程的參數來維護一個計數器。要做到這一點的方法之一是:

(define (howmany lst) 
    (let loop ((n 0) (lst lst)) 
    (if (null? lst) n 
     (loop (if (> (car lst) 0) (add1 n) n) (cdr lst))))) 

測試:

> (howmany '(1 2 3 4 5)) 
5 
> (howmany '(1 2 3 -4 5)) 
4 
> (howmany '(1 -2 3 -4 5)) 
3 
> (howmany '(-1 -2 3 -4 5)) 
2 
0

這是你的問題:(> list 0)

你比較列表爲數字。嘗試(> (length list) 0)(not (null? list))。或者任何關於「cond塊中的默認條件」的Scheme關鍵字是。

編輯:這是當你關注最重要的錯誤信息時得到的結果。當然,加雷思是對的。

+0

Scheme對於「cond中的缺省條件」沒有特殊的關鍵字。當你想要一個默認條件時,你只要給出'#t'(方案的關鍵字爲true)作爲條件。 – sepp2k 2010-11-11 21:20:36

+0

啊,謝謝。我涉獵了Common Lisp,所以Scheme對我來說就像是一種外來的方言。 – Mihai 2010-11-11 21:23:41

+0

「沒有特殊關鍵字」 - 在[R6RS](http://www.r6rs.org/final/html/r6rs/r6rs-ZH-14.html#node_sec_11.4.5)中有'else' – 2010-11-11 21:55:10

4

你不能指望(> list 0)工作 - list是一個列表,但>期望其參數是數字。

您想查看列表中的第一個元素是否爲正數,因此應該是(> (car list) 0)

但是:您的代碼存在更大的問題:如果第一個元素爲負數或零,會發生什麼情況?

+0

你的意思是'#t'而不僅僅是't'? – erjiang 2010-11-11 21:18:00

+0

是的,'#t'。我更像一個詭計,而不是一個陰謀家,我經常忘記這些微小的差異。 – 2010-11-11 21:20:17

+0

我明白你的觀點,如果第一個數字爲零或負數,它就不會做任何事情。如果列表看起來像這樣:'(1 2 -3)它崩潰,並告訴我期待類型編號。 – 2010-11-11 21:46:03

0
positiveCounter(seq) 
    if typeof(first(seq)) == num 
     if first(seq) > 0 
      return positiveCounter(rest(seq) + 1 
     else 
      return positiveCounter(rest(seq) 
    else 
     #Handle Errors Somehow. 

我將使用遞歸算法的僞代碼。

我不知道Scheme或Clojure(你的方括號讓我想起)。

或者你可以在Common Lisp-extra換行符中使用相當快速的應用方法來實現可讀性。

(defun positiveCounter (seq) 
    (reduce #'+ 
      (mapcar 
      #'(lambda (x) 
       (if (atom x) 
        (if (> x 0) 1 0) 
        0)) 
      seq))) 
+0

某些Schemes允許的方括號純粹是爲了便於閱讀 - 它們與parens是同樣的東西。該方案等價物非常接近:'(define(positive-counter seq)(apply +(map(lambda(x)(if(number?x)(if(> x 0)1 0))seq))) ' – Chuck 2010-11-12 00:51:25

+0

@Chuck:很高興知道。 – 2010-11-12 02:06:43

+0

@Chuck:'(if(and(number?x)(> x 0))1 0)',當然? – 2010-11-12 04:55:12