Scheme 如何拼写球拍中的数字?(咒语)
我是Racket新手,我想编写一个函数Scheme 如何拼写球拍中的数字?(咒语),scheme,racket,Scheme,Racket,我是Racket新手,我想编写一个函数spellNum,它可以实现以下功能: (spellNum 467) ---> '(four six seven) 我不知道怎么开始。我通过查看在线文档开始编程,但我不知道如何在Dr Racket中声明变量。我基本上是一个巨蟒人。有人能帮我编程这个函数吗 (define (spellNum n) (if (number? n) (what should I do ?) null)) 编辑: 一个完整的解决方案已经发布,所以我
spellNum
,它可以实现以下功能:
(spellNum 467) ---> '(four six seven)
我不知道怎么开始。我通过查看在线文档开始编程,但我不知道如何在Dr Racket中声明变量。我基本上是一个巨蟒人。有人能帮我编程这个函数吗
(define (spellNum n)
(if (number? n)
(what should I do ?)
null))
编辑: 一个完整的解决方案已经发布,所以我想我可以向您展示如何编写一个惯用的过程。请注意,
number->list
使用了一种称为尾部递归的技术来高效地表示循环。尽管(来自Python背景)使用显式循环构造(如@uselpa的回答所示)可能很有诱惑力,但要真正理解Scheme的精神,您应该学习如何使用递归编写循环,这是用这种语言表示迭代的标准方式(在罗马,就像罗马人一样):
正如Oscar所说,您应该真正学习特定于方案的习惯用法 但是,从Python开始,您可能会发现使用经典循环更容易,Racket也提供了这些循环。让我们构建一个特定于球拍的解决方案: 首先,
for/list
遍历一个序列(例如一个列表、一个字符串,与Python的for…in
construct相同)并构建一个列表:
(define (spellNum n)
(for/list [(c (number->string n))]
c))
(spellNum 467)
=> '(#\4 #\6 #\7)
这将生成一个字符列表。让我们再次将其转换为字符串:
(define (spellNum n)
(for/list [(c (number->string n))]
(string c)))
(spellNum 467)
=> '("4" "6" "7")
现在,我们可以使用string->number
将它们转换为数字:
(define (spellNum n)
(for/list [(c (number->string n))]
(string->number (string c))))
(spellNum 467)
=> '(4 6 7)
最后,将这些转换为符号:
(define (spellNum n)
(for/list [(c (number->string n))]
(list-ref '(zero one two three four five six seven eight nine)
(string->number (string c)))))
(spellNum 467)
=> '(four six seven)
因此,完整的过程可以用3-4行代码表示,但这也是特定于球拍的。我强烈鼓励你学习做事的方法,这种方法更一般,也更具启发性;-) (需要srfi/26)
(定义(拼写编号n)
(如果(编号?n)
(设([h(hash#\1“一”)
#\2“两个”
#\3“三”
#\4“四”
#\5“五”
#\6“六”
#\7“七”
#\8“八”
#\9“九”
#\0“零”
#\[点])
(字符串连接(映射(剪切散列参考h)(字符串->列表(编号->字符串n)))“”)
其他的
“不是数字”))
感谢您的宝贵建议:)(定义(数字->符号n)(案例n((0)‘零’((1)‘二’((3)‘三’((4)‘四’((5)‘五’((6)‘六’((7)‘七’((8)‘八’((9)‘九)))或简单地(定义(数字->符号n)(列表参考(零一二三四五七八九))
'(define(number->list n)(define nlist null)(while(=n0)(set!nlist(cons(余数n10)nlist))(set!n(/n10)))nlist)'这似乎不起作用,因为错误的while循环不是有效的Racket代码,而且它不是惯用的-在方案中,我们使用递归来实现循环,并避免改变状态的操作。我可以推荐一本关于这个计划的好书吗?将帮助您开始使用Schemei进行正确的编程。在其网站上找不到关于racket的良好文档。请看这里:。我建议从球拍指南开始:你真的应该问另一个问题。但是尝试在case语句中使用字符串而不是数字。。。例如,('one“1”)
,然后使用以下命令<代码>(字符串->数字(字符串连接(地图符号->数字(一三五)))
(define (spellNum n)
(for/list [(c (number->string n))]
(string->number (string c))))
(spellNum 467)
=> '(4 6 7)
(define (spellNum n)
(for/list [(c (number->string n))]
(list-ref '(zero one two three four five six seven eight nine)
(string->number (string c)))))
(spellNum 467)
=> '(four six seven)
(require srfi/26)
(define (spell-number n)
(if (number? n)
(let ([h (hash #\1 "one"
#\2 "two"
#\3 "three"
#\4 "four"
#\5 "five"
#\6 "six"
#\7 "seven"
#\8 "eight"
#\9 "nine"
#\0 "zero"
#\. "point" )])
(string-join (map (cut hash-ref h <>) (string->list (number->string n))) " "))
;; else
"not a number"))