我需要一个程序写的程序的子程序,采用一个整数,比如说34109,并将其放入一个元素为3,4,1,0,9的列表中。该整数可以是任意长度。有没有人有这个技巧?我曾想过为每个地方使用模数,但我认为它不应该那么复杂。计划编号列表
Q
计划编号列表
2
A
回答
3
最简单的方法我能想到的是,通过使用算术运算和用于实现尾递归的named let
:
(define (number->list num)
(let loop ((num num)
(acc '()))
(if (< num 10)
(cons num acc)
(loop (quotient num 10)
(cons (remainder num 10) acc)))))
或者,您也可以使用字符串操作解决这个问题:
(define char-zero (char->integer #\0))
(define (char->digit c)
(- (char->integer c) char-zero))
(define (number->list num)
(map char->digit
(string->list (number->string num))))
这可以被压缩成一个单一的功能,但我相信它更容易理解,如果我们在子部分分割为上述问题。
(define (number->list num)
(map (lambda (c) (- (char->integer c) (char->integer #\0)))
(string->list
(number->string num))))
反正结果如预期:
(number->list 34109)
> '(3 4 1 0 9)
+0
感谢您的'让'解决方案 – demas
2
事情是这样的:
(define (num2list-helper num lst)
(cond ((< num 10) (cons num lst))
(else (num2list-helper (floor (/ num 10)) (cons (modulo num 10) lst)))))
(define (num2list num)
(num2list-helper num '()))
(num2list 1432)
由于itsbruce评论,你可以躲在里面最主要的一个辅助函数:
(define (num2list num)
(define (num2list-helper num lst)
(cond ((< num 10) (cons num lst))
(else (num2list-helper (floor (/ num 10)) (cons (modulo num 10) lst)))))
(num2list-helper num '()))
(num2list 1432)
未完待续......
0
我不是人工循环的粉丝,所以这里的基础上展开(负载SRFI 1和SRFI 26第一)的解决方案:
(define (digits n)
(unfold-right zero? (cut modulo <> 10) (cut quotient <> 10) n))
尽管这会返回一个空列表。如果你希望它返回(0)
相反,我们添加一个特殊情况:
(define (digits n)
(case n
((0) '(0))
(else (unfold-right zero? (cut modulo <> 10) (cut quotient <> 10) n))))
当然,你也可以概括为这样其他基地。在这里,我实现这个使用可选参数,因此,如果您没有指定基数,则默认为10:
(define (digits n (base 10))
(case n
((0) '(0))
(else (unfold-right zero? (cut modulo <> base) (cut quotient <> base) n))))
不同的方案实现使用可选参数不同的语法;以上使用球拍式(和/或SRFI 89式)语法。
相关问题
- 1. 从计划中编号和编号或列表和编号构建列表
- 2. 计划 - 定义列表VS符号
- 3. 计划 - 列表
- 4. 计划 - 在列表
- 5. 计划返回对列表
- 6. 计划通过列表
- 7. 计划:递归和列表
- 8. 返回计划列表
- 9. 在列表中插入列表计划
- 10. 编号表列
- 11. 计划 - 预计非空列表
- 12. 计划列表计数功能
- 13. 计划表设计
- 14. 以编程方式更新计划表基于表的Quartz计划程序
- 15. 编号列表框
- 16. 子列表编号
- 17. UL列表编号
- 18. “计划接收信号‘SIGABRT’
- 19. 表计划
- 20. 星号和前女友拨号计划?
- 21. 计划 - 双引号可以分号吗?
- 22. 变换的非编号列表编号列表使用XSLT
- 23. 在计划中分配原子列表
- 24. 计划乘法列表项目
- 25. 通过搜索列表和计划(DrRacket)
- 26. 生成计划中的倍数列表
- 27. 计划 - 在列表中插入数
- 28. 计划中模块的导出列表
- 29. 计划 - 列表中的子集
- 30. 试图在计划中反转列表
使用模数,这不是compilcated :)我不知道你的意思是'每个地方'。您只需用模10提取有效数字,将数字除以10,然后重复(也许递归)。 – piokuc
嗨,感谢piokuc,这对于使用部门以及减少数量有意义。 – Matt