2014-03-27 28 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的顺序。

相关问题