2017-04-02 30 views
0

我是新來的方案,有困難的方案中的向量。我需要創建一個函數來計算向量中的非零輸入的數量。我需要通過不將矢量轉換爲列表來做到這一點。例如 例如。計算矢量的非零輸入的函數

(non-zero-dim #(3 0 2 4 0 2)) 
returns 4 

到目前爲止我的代碼是

(define non-zero-input 
(lambda (vector) 
(let ((size (vector-length vector))) 
    do ((position 0 (+ position 1)) 
     (total 0 
(if ((not (zero? vector-ref vector position))) 
(+ total 1)) 
(((= position size) total))))))) 

但是我得到這個錯誤:do: bad syntax in: (do ((position 0 (+ position 1)) (total 0 (if ((not (zero? vector-ref vector position))) (+ total 1)) (((= position size) total)) 如何解決這個問題?

回答

0

使用內置程序vector-lengthvector-filter-not,您可以簡化功能:

(define (non-zero-dim vec) 
    (vector-length (vector-filter-not zero? vec))) 

例如,

> (non-zero-dim #(3 0 2 4 0 2)) 
4 

有些事情要考慮:

  • 跟蹤o f你的括號。例如,(zero? vector-ref vector position)應該是(zero? (vector-ref vector position)),其中zero?的元數是1,而vector-ref的元數是2。同樣與do ...(do ...
  • if聲明必須其他條款(即(if condition then else))。例如,(if true 1)會失敗,但(if true 1 2)會通過。因此,(if ((not (zero? vector-ref vector position))) (+ total 1))會失敗。