我目前正在尝试将整数转换为列表。
例如
1234 => 由 1、2、3、4 组成的列表
我有这个:
(string->list (number->string 1234))
不幸的是,它添加了#'s 和\'s。我猜这是一个数字的字符串表示。我怎样才能删除这些符号。因为我需要重新排序整数,并打印出一个列表。
这是上面命令的输出:
(#\1 #\2 #\3 #\4)
我目前正在尝试将整数转换为列表。
例如
1234 => 由 1、2、3、4 组成的列表
我有这个:
(string->list (number->string 1234))
不幸的是,它添加了#'s 和\'s。我猜这是一个数字的字符串表示。我怎样才能删除这些符号。因为我需要重新排序整数,并打印出一个列表。
这是上面命令的输出:
(#\1 #\2 #\3 #\4)
这是我编写的一个函数,它通过每次除以 10 来分解数字:
(define (num->list num)
(if (< num 10)
(list num)
(append (num->list (floor (/ num 10)))
(list (- num (* 10 (floor (/ num 10))))))))
显然,这只适用于正整数,但如果你需要负数,它可以很容易地修改。
正如乔纳森所说,#\ 表示它是一个字符。所以你必须将字符转换为数字。这是一个简单的方法。
(map (lambda (c) (- (char->integer c) 48))
(string->list (number->string 1234)))
我不熟悉方案,但一种稍微更密集的代码、独立于语言的方法是使用数学循环来获取每个数字。
如果 1234 是 x: digit_1 = x%10 digit_2 = x%100 - digit_1 digit_3 = x%1000 - digit_2 - digit_1 等。
您需要在每个站点添加一个检查,如果 x < 1000,则在数字 3 之后停止。根据语言,您可以通过各种方式为此添加一个循环。
当您将字符串转换为列表时,您正在构建一个字符列表,这就是您得到 # 的原因。#\ 是字符分隔符。因此,当您完成列表操作后,您可以相当轻松地将其重新转换回字符串。
我只是帮你注意:
(floor (/ num 10))
与在方案中使用商程序相同:
(quotient num)
这是它的例子:
Welcome to DrRacket, version 6.1.1 [3m].
Language: Pretty Big; memory limit: 128 MB.
> (floor (/ 235 10))
23
> (quotient 235 10)
23
这样我们可以重写@Kyle 函数将如下所示:
(define (numberToList number)
(if (< number 10) (list number)
(append (numberToList (quotient number 10))
(list (- number (* 10 (quotient number 10)))))))