2010-02-25 82 views
1

如何編寫一個程序,該程序需要一個任意的 sexpression由整數組成,並返回與原始相同的性別表達式,但所有整數加倍?雙倍計劃

+2

這聽起來很像作業,在這種情況下,你應該添加「家庭作業」標籤。 – 2010-02-25 17:21:16

+2

因爲你所有的問題都是在過去的10天裏,並且在你的作業中關於Scheme的'how-to',我會推薦Friedman和Felleison的The Little Schemer。在完成1或2章之後,像這樣的問題將變得輕而易舉(並且您不必爲了答案而去SO)! 或者如何設計程序http://htdp.org/ 祝您的課程順利! – 2010-02-25 17:59:31

回答

0
(define double 
    (lambda (x) 
     (cond ((null? x) (list)) 
     ((list? (car x)) (cons (double (car x)) (double (cdr x)))) 
     (else (cons (* 2 (car x)) (double (cdr x))))))) 

編輯 修正這一點。感謝Nathan Sanders指出我對嵌套列表的初步監督。

+1

怎麼樣(double'(1(2 3)(4 5))) – 2010-02-25 17:37:33

0

這聽起來像你想要的是在s表達式中找到每個整數,然後將其加倍,同時保持其餘部分相同。

如果你不知道,s表達式只是可能會包含其它鏈表,它是有道理的來對付他們的水平。例如,這裏有一個方法來打印上的S-表達的一個級別的所有值:

(define (print-level-one sexp) 
    (display (car sexp)) 
    (print-level-one (cdr sexp))) 

這將最終調用上的S-expression的每一個部分的car顯示。

你可以做類似的事情。您需要使用integer?pair?這兩個函數來檢查是否有一個整數(應加倍)或另一個列表,它應該像頂級列表一樣處理。

(注意:我是故意含糊其詞,因爲關於上述功課的評論如果你只是想要的答案,而不是幫助找出答案,這麼說,我會改變這一點)

0
An Sexp of numbers is one of 
-- Number 
-- ListOfSexp 

A ListOfSexp is one of 
-- empty 
-- (cons Sexp ListOfSexp) 

所以,你需要一個函數來處理這兩個數據定義。由於數據定義彼此交叉引用,所以這些功能也會執行相同的操作。每個單獨的功能都非常簡單。

0
(define (double E) 
    (cond ((null? E) '()) 
     ((list? (car E)) (cons (double (car E)) (double (cdr E)))) 
     ((number? E) (list E)) 
     (else (cons (* 2 (car E)) (double (cdr E)))) 
     )) 
0
(map (lambda (x) (* x 2)) '(1 2 3 4 5)) => '(2 4 6 8 10) 

它有什麼作用? (lambda (x) (* x 2))需要一個數字並將其加倍,map將該函數應用於列表的每個元素。

編輯:哦,但它不會進入樹木。

1

我們要接受一個S-表達式作爲輸入,並且輸出S-表達具有相同的結構,但是其中每個整數被加倍的過程;一般地,程序映射S-表達式:

 
(define (double x) 
    (if (number? x) 
     (* x 2) 
     x))) 

(define (sexp-map op sexp) 
    ...) 

(sexp-map double some-sexpression) 

我們得到(SEXP)將是任一種原子,在這種情況下,結果是(OP SEXP),或S的一個列表中的S-表達-expressions。在這種情況下,我們可能會考慮將OP映射到SEXP上,但S表達式任意嵌套。我們實際上應該做的是映射一個過程,該過程將用OP轉換較小S表達式中的每個元素。那麼你會看看,這只是描述我們目前正在編寫的過程的目標的另一種方式。所以我們可以將SEXP-MAP映射到SEXP。

好了,沒有我們做不到的實際,因爲SEXP-MAP需要用兩個參數來調用,MAP只會給它一個。爲了解決這個問題,我們使用一個參數的幫助程序F:

 
(define (sexp-map op sexp) 
    (define (f x) 
    (if (list? x) 
     (map f x) 
     (op x))) 
    (f sexp)) 

F結束了所有的實際工作。SEXP-MAP被簡化爲一個更容易被程序員使用的外觀。