如何編寫一個程序,該程序需要一個任意的 sexpression由整數組成,並返回與原始相同的性別表達式,但所有整數加倍?雙倍計劃
雙倍計劃
回答
(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指出我對嵌套列表的初步監督。
怎麼樣(double'(1(2 3)(4 5))) – 2010-02-25 17:37:33
這聽起來像你想要的是在s表達式中找到每個整數,然後將其加倍,同時保持其餘部分相同。
如果你不知道,s表達式只是可能會包含其它鏈表,它是有道理的來對付他們的水平。例如,這裏有一個方法來打印上的S-表達的一個級別的所有值:
(define (print-level-one sexp)
(display (car sexp))
(print-level-one (cdr sexp)))
這將最終調用上的S-expression的每一個部分的car
顯示。
你可以做類似的事情。您需要使用integer?
和pair?
這兩個函數來檢查是否有一個整數(應加倍)或另一個列表,它應該像頂級列表一樣處理。
(注意:我是故意含糊其詞,因爲關於上述功課的評論如果你只是想要的答案,而不是幫助找出答案,這麼說,我會改變這一點)
An Sexp of numbers is one of
-- Number
-- ListOfSexp
A ListOfSexp is one of
-- empty
-- (cons Sexp ListOfSexp)
所以,你需要一個函數來處理這兩個數據定義。由於數據定義彼此交叉引用,所以這些功能也會執行相同的操作。每個單獨的功能都非常簡單。
(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))))
))
(map (lambda (x) (* x 2)) '(1 2 3 4 5)) => '(2 4 6 8 10)
它有什麼作用? (lambda (x) (* x 2))
需要一個數字並將其加倍,map
將該函數應用於列表的每個元素。
編輯:哦,但它不會進入樹木。
我們要接受一個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被簡化爲一個更容易被程序員使用的外觀。
- 1. 雙倍和雙倍?互換?
- 2. 爲什麼雙倍「==」和「等於」雙倍?
- 3. 在雙倍和雙倍差異
- 4. 生成計劃中的倍數列表
- 5. 計算雙倍數的百分比
- 6. android:計算雙倍百分比?
- 7. 私人雙倍計算錯誤
- 8. 雙倍遞增
- 9. 劃分兩個整數而不鑄造爲雙倍
- 10. 很長的雙倍
- 11. 計劃 - 雙引號可以分號嗎?
- 12. 爪哇圓翻倍並獲得雙倍
- 13. Java雙倍與雙倍:類型與原始類型
- 14. 生成隨機正雙倍返回負雙倍值
- 15. 轉換MATLAB類型:從複雜的雙倍到雙倍
- 16. Java:在負雙倍和正雙倍的範圍內生成隨機雙數
- 17. 篩選出雙倍空間
- 18. 的Android雙倍返還
- 19. 鑄造Vec *爲雙倍*
- 20. OCaml雙倍分號錯誤
- 21. wp_mail()發送雙倍內容
- 22. 我的雙倍被舍入
- 23. 雙倍字體大小
- 24. Html.fromHTML刪除雙倍空間
- 25. NumberFormatException:無效的雙倍:「2」
- 26. 總結雙倍ReadLine值?
- 27. 雙倍遭受溢出?
- 28. iPhone:圓形雙倍數值
- 29. 雙倍範圍的jQuery SLider
- 30. java即時雙倍到int
這聽起來很像作業,在這種情況下,你應該添加「家庭作業」標籤。 – 2010-02-25 17:21:16
因爲你所有的問題都是在過去的10天裏,並且在你的作業中關於Scheme的'how-to',我會推薦Friedman和Felleison的The Little Schemer。在完成1或2章之後,像這樣的問題將變得輕而易舉(並且您不必爲了答案而去SO)! 或者如何設計程序http://htdp.org/ 祝您的課程順利! – 2010-02-25 17:59:31