Scheme 如何拼写球拍中的数字?(咒语)

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)) 编辑: 一个完整的解决方案已经发布,所以我

我是Racket新手,我想编写一个函数
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"))