2015-02-09 72 views
0

我想寫一個程序,它將在列表中添加數字。但是,當我將輸入作爲列表輸入時,Scheme不會給出輸出。計劃返回錯誤類型申請列表輸入

我的代碼如下:

(define (sumlist lst) 
    (cond ((pair? lst) (+ (car lst) (sumlist(cdr lst)))))) 

爲什麼會出現這種情況?我正在給予正確的輸入,即我在引用列表。

我給輸入如下: (sumlist '(1 2 3))

編輯: 我稍微改變了問題。該列表未在pair? 'lst中引用,這就是我遇到錯誤的原因。 現在,我沒有收到錯誤。但是,我也沒有得到任何輸出。

EDIT2: 我在pair? lst沒有引用列表。但是,現在它給了我以下錯誤:在arg2中錯誤類型# 我已經相應地更新了代碼。

+1

我不認爲你明白函數應用程序如何在方案語法中表示。這應該是'(汽車1st)'和'(sumlist(cdr lst))'。 – 2015-02-09 05:10:38

+0

'(pair?'lst)'看起來有嫌疑...... – leppie 2015-02-09 05:11:40

+0

@leppie那也是。奇怪的是,這是'(pair?lst)',直到幾分鐘前,OP編輯了這個問題。 – 2015-02-09 05:12:17

回答

2
  1. 您的函數應用程序語法錯誤。功能應用始終處於方案前綴,即car(lst)應該是(car lst)
  2. 此外,(pair? 'lst)是錯誤的,因爲你不應該引述的說法。這將測試符號lst是否是一對,這顯然總是錯誤的。
  3. 您需要一個基本情況下,當您的不要想要遞歸 - 當您收到空列表 - 應該返回0

把所有這些結合在一起,你應該有這樣的:

(define (sumlist lst) 
    (if (pair? lst) 
     (+ (car lst) (sumlist (cdr lst))) 
     0)) 

(我也改變condif因爲cond在這種情況下沒有必要的。)

+0

爲什麼我需要一個基本案例? Scheme不返回計算的最後一個表達式的值嗎?所以,即使我沒有提到一個基本情況,Scheme會在條件'pair?時返回最後一個表達式?因爲「變得虛假。不是嗎? – 2015-02-09 05:20:48

+1

@RohitShinde首先,這沒有任何意義,因爲它會返回'#f',它不能被添加到數字中。其次,它不能像'cond'那樣工作,因爲'cond'擴展成'if'形式,'if'是一種特殊的形式。具體來說,如果沒有條件匹配,沒有'else'子句的'cond'返回'#'。 – 2015-02-09 05:22:32