2013-04-22 21 views
2

我是品牌嶄新的計劃。除了幻燈片在課堂上向我解釋的那樣,今晚是我第一次玩這個遊戲。我必須編寫一個方案程序,它接受用戶輸入操作員,然後對其後的數字執行該操作。 (換句話說,實現我自己的內置'+','*'等操作符的方案版本)。問題是我必須使用遞歸。試圖繞着這個方案的語法來操縱我,讓我很難確定從哪裏開始。因此,我決定從一些代碼開始,這些代碼至少遞歸地總結用戶輸入的值(不用擔心識別用戶輸入運算符和括號)。我只是簡單地無法弄清楚如何使它工作。這裏就是我想:我想遞歸求和用戶輸入的整數

(define run (lambda (x) 
(cond 
    ((eqv? x "a") (display x)) 
    (else (+ x (run(read)))) 
))) 

(run (read)) 

條件檢查,如果x等於「A」的用意是讓我打破了遞歸現在的方式。在最後的版本中,輸入將在一組括號之間,但是當我來到它時,我認爲我會穿過那座橋。無論如何,代碼只是繼續接受輸入,並永不停止。所以,顯示x的條件永遠不會被調用,我猜。我知道我可能做錯了一切,我會非常欣賞一些指針。

編輯:好的,我至少開始意識到某些東西沒有道理。比如我的顯示x實際上不會給出總和,因爲我不以任何方式將總和存儲在x中。但是,我仍然不明白爲什麼當我輸入字母a時代碼至少沒有停止。

編輯2:我已經得到它的工作,但只有當條件等於1.我怎樣才能得到它來識別輸入的字符或更好,但右括號讓它結束遞歸只是喜歡它與1? :

(define run (lambda (x) 
(cond 
    ((eq? x 1) 0) 
(else (+ x (run(read)))) 
))) 

(run (read)) 

回答

1

文件結束(EOF)標記輸入結束。 Scheme對此有一個程序eof-object?。您的代碼基本正確:

(define (run x) 
    (if (eof-object? x) 
     0 
     (+ x (run (read))))) 

您使用Control-D結束運行。如果由於某種原因,您無法訪問eof-object?,請使用X之類的特殊字符。在這種情況下,你的測試將是(eq? x #\X)

0
(define (addition-loop) 
(let ((answer (read))) 
     (if (number? answer) 
      (+ answer (addition-loop)) 
      0))) 

這隻要你輸入的東西是不是數字打破。

另外,正如你所看到的,你可以有一個零參數的函數。

無論如何,你的代碼的問題是當你進入閱讀時,它的價值實際上是一個'a或(引號a),而不是「a」。

(eqv? 'a "a") 

;Value: #f