2014-03-27 26 views
0

how to spell a number in racket? (spellNum)的溶液後,現在,我試圖寫的函數,而此函數的相反即Tonumber函數(tonumber「(一二三) - > 123

(tonumber ‘(one two three) --> 123 

到目前爲止我有。寫這個工作代碼

(define (symbol->digit n) 
    (case n 
    ('zero 0) 
    ('one 1) 
    ('two 2) 
    ('three 3) 
    ('four 4) 
    ('five 5) 
    ('six 6) 
    ('seven 7) 
    ('eight 8) 
    ('nine 9) 
    (else (error "unknown symbol:" n)))) 



(define (numlist n) 
    (map symbol->digit n)) 



(numlist '(one two three)) 

從numlist,我得到了「(1 2 3),但爲了有以下功能中,我想轉換列表中的一些問題進行編號

(define (list->number l) 
    (set! multiplier (* 10 (lenght l))) 
    (for/list [(c l)] 
    (* multiplier c)) 
    (set! multiplier (/ multiplier 10))) 

(list->number '(1 2 3)) 

任何幫助將不勝感激。我找不到所有類型的在線循環文件。在 http://docs.racket-lang.org/ts-reference/special-forms.html?q=loop#%28part._.Loops%29

我想熟悉球拍,所以我想避免內置轉換功能。在list-> number中,我試圖從列表中逐個取數字,然後我想將它們與10,100,1000等數相乘,具體取決於列表的長度。這樣它可以返回一個數字。例如「(1 2 3)= 1 * 100 + 2×10 + 3 * 1

+1

我想如果你花時間瞭解你的其他問題的答案,那麼這個答案將是你自己的。 – GoZoner

+0

這是一個鬼鬼祟祟的編輯!我不確定拒絕使用'語言'是否構成'熟悉'該語言...... – beoliver

回答

1

這是我的previous solution,再次使用尾遞歸爲list->number過程正好相反:

(define (symbol->digit n) 
    (case n 
    ('zero 0) 
    ('one 1) 
    ('two 2) 
    ('three 3) 
    ('four 4) 
    ('five 5) 
    ('six 6) 
    ('seven 7) 
    ('eight 8) 
    ('nine 9) 
    (else (error "unknown symbol:" n)))) 

(define (list->number lst) 
    (let loop ((acc 0) (lst lst)) 
    (if (null? lst) 
     acc 
     (loop (+ (car lst) (* 10 acc)) (cdr lst))))) 

(define (toNumber lst) 
    (list->number (map symbol->digit lst))) 

它按預期工作:

(toNumber '(four six seven)) 
=> 467 

只是爲了好玩,球拍,我們可以編寫使用iteration and comprehensionslist->number的功能。即使如此,請注意,我們並沒有在任何地方使用set!,在Python這樣的語言中突變狀態是常見的,但是在一般的Scheme中,並且特別是我們試圖避免修改循環內部的變量 - 有更多優雅的方式來表達解決方案:

(define (list->number lst) 
    (for/fold ([acc 0]) ([e lst]) 
    (+ e (* 10 acc)))) 
+0

感謝您的快速回復。你能告訴我循環是如何工作的嗎?我知道什麼是汽車和CDR和空?並讓我但無法找到循環在線 –

+0

我正在使用['for/fold'](http://docs.racket-lang.org/reference/for.html#%28form._%28%28lib ._racket%2Fprivate%2Fbase..rkt%29._for%2Ffold%29%29)循環。在它裏面,'e'遍歷每個元素,'acc'累積答案,查看鏈接以獲取更多示例 –

0
(define (symbol->digit n) 
    (case n 
    ('zero "0") 
    ('one "1") 
    ('two "2") 
    ('three "3") 
    ('four "4") 
    ('five "5") 
    ('six "6") 
    ('seven "7") 
    ('eight "8") 
    ('nine "9") 
    (else (error "unknown symbol:" n)))) 

(define (symbols->number symb) 
    (string->number (string-join (map symbol->digit symb) ""))) 

(symbols->number '(one two three)) 
0

很多方法可以使貓變皮。這裏是使用fold-left的版本。像Óscar的解決方案一樣,它使用數學而不是字符和字符串。

#!r6rs 
(import (rnrs)) 

;; converts list with worded digits into 
;; what number they represent. 
;; (words->number '(one two zero)) ==> 120 
(define (words->number lst) 
    (fold-left (lambda (acc x) 
       (+ x (* acc 10))) 
      0 
      (map symbol->digit lst))) 

對於#!racket版本只是重新命名fold-leftfoldl和開關的xacc的順序。

相關問題