首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通数函数(tonumber‘(一二三)-> 123

通数函数(tonumber‘(一二三)-> 123
EN

Stack Overflow用户
提问于 2014-03-27 22:52:24
回答 3查看 328关注 0票数 0

如何拼写球拍中的数字?(spellNum)的解决方案之后,现在我正在尝试编写一个与此函数相反的函数。i.e

代码语言:javascript
复制
(tonumber ‘(one two three) --> 123

到目前为止,我已经编写了这个工作代码。

代码语言:javascript
复制
(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,我得到了‘(12,3)。但是在下面的函数中有一些问题,我想将列表转换为数字。

代码语言:javascript
复制
(define (list->number l)
  (set! multiplier (* 10 (lenght l)))
  (for/list [(c l)] 
    (* multiplier c))
  (set! multiplier (/ multiplier 10)))

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

任何帮助都将不胜感激。我在网上找不到所有循环的文档。在.Loops%29

我想变得熟悉球拍,所以我想避免内置转换功能。在list->number中,我尝试从列表中逐个获取数字,然后根据列表的长度,用10,100,1000乘以它们。这样它就可以返回一个数字。例如,‘(12,3) = 1*100+2*10+3*1

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-27 23:02:23

下面是与我的前解完全相反的地方,再次为list->number过程使用尾递归:

代码语言:javascript
复制
(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)))

它如预期的那样运作:

代码语言:javascript
复制
(toNumber '(four six seven))
=> 467

为了好玩,我们可以用list->number编写一个像迭代与理解这样的函数。尽管如此,请注意,我们在任何地方都不使用set!,在类似于Python的语言中,变异状态是规范的,但是在一般情况下,特别是在ways中,我们试图避免修改循环中的变量--有更优雅的方法来表示解决方案:

代码语言:javascript
复制
(define (list->number lst)
  (for/fold ([acc 0]) ([e lst])
    (+ e (* 10 acc))))
票数 1
EN

Stack Overflow用户

发布于 2014-03-27 22:53:49

代码语言:javascript
复制
(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))
票数 1
EN

Stack Overflow用户

发布于 2014-03-27 23:54:32

剥猫皮的方法很多。下面是使用fold-left的版本。就像奥斯卡的解决方案,它使用的是数学,而不是字符和字符串。

代码语言:javascript
复制
#!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-left重命名为foldl,并切换xacc的顺序即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22700896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档