喜欢转换(1 2 3 4)到1234~
答案 0 :(得分:4)
问题的特点是将列表合并为单个值,强烈建议使用折叠:
(define (fold-left op initial items)
(define (loop result rest)
(if (null? rest)
result
(loop (op result (car rest))
(cdr rest))))
(loop initial items))
(define (list->num list)
(fold-left (lambda (value digit)
(+ (* value 10) digit))
0
list))
(list->num '(1 2 3 4))
;Value: 1234
答案 1 :(得分:2)
这听起来像是一个家庭作业问题......
考虑十的权力以及像1234这样的数字中的每个数字实际上意味着什么。
答案 2 :(得分:2)
这是一个只使用尾递归的解决方案
(define (list->num l)
(cond
((null? l) 0)
((null? (cdr l)) (car l))
(else (let ([first (* 10 (car l))][rest (cdr l)])
(list->num (cons (+ first (car rest)) (cdr rest)))))))
答案 3 :(得分:2)
以下是我的Standard Prelude中的两个函数,它们在数字和数字列表之间进行转换;两者都采用一个可选参数来指定要使用的基数。它们是用标准的R4RS计划编写的,应该适用于最近的任何Scheme系统。
(define (digits n . args)
(let ((b (if (null? args) 10 (car args))))
(let loop ((n n) (d '()))
(if (zero? n) d
(loop (quotient n b)
(cons (modulo n b) d))))))
(define (undigits ds . args)
(let ((b (if (null? args) 10 (car args))))
(let loop ((ds ds) (n 0))
(if (null? ds) n
(loop (cdr ds) (+ (* n b) (car ds)))))))
答案 4 :(得分:1)
我编写的代码如下~~~它有效,但代码可能太长了~~~
(define (power b e)
(define (power-product a b e)
(if (= e 0)
a
(power-product (* a b ) b (- e 1))))
(power-product 1 b e))
(define (length items)
(if (null? items)
0
(+ 1 (length (cdr items)))))
(define (list->num lst)
(if (null? lst)
0
( + (* (power 10 (- (length lst) 1)) (car lst)) (list->num (cdr lst)))))
答案 5 :(得分:1)
由于您已发布工作解决方案,我会发布此信息。 如果你不能使用let,你可以用辅助函数做类似的事。
(define (list->num l)
(let loop ((n 0) (l l))
(if (empty? l)
n
(loop (+ (* 10 n) (car l)) (cdr l)))))
像“The Little Schemer”这样的书价格低廉,阅读既简单又有趣,它让你在“计划模式”中思考。它将帮助您编写更简洁的解决方案。