我正在学习计划,我遇到了一个示例问题。 将列表作为输入将每个元素转换为数字的数字,并按向后的顺序将列表转换为数字。例如 (4 2 0 1)=> 1024,(3 9 9)=> 993等。
我已经有了基本的构造:
(define dlnat-to-nat
(lambda (d)
(cond
((null? d) 0)
((not (list? d)) (error "No list given in parameters" d))
((append (car d) (if (not (null? (cdr d)))
(dlnat-to-nat (cdr d))
'()))))))
我试图使用(追加)并且在这种情况下不起作用,我不知道有任何替代方法将数字附加为数字?
答案 0 :(得分:0)
您不能使用列表操作来构建数字作为输出,append
用于附加列表,而不是数字。改为使用基本的算术运算:
(define dlnat-to-nat
(lambda (d)
(cond ((or (null? d) (not (list? d)))
(error "Invalid input:" d))
((null? (cdr d))
(car d))
(else
(+ (car d) (* 10 (dlnat-to-nat (cdr d))))))))
更有效的解决方案是使用尾递归:
(define dlnat-to-nat
(lambda (d)
(if (or (null? d) (not (list? d)))
(error "Invalid input:" d)
(let loop ((lst (reverse d)) (acc 0))
(if (null? lst)
acc
(loop (cdr lst) (+ (car lst) (* 10 acc))))))))
更惯用的实现将使用更高阶的程序:
(define dlnat-to-nat
(lambda (d)
(if (or (null? d) (not (list? d)))
(error "Invalid input:" d)
(foldr (lambda (e acc) (+ e (* 10 acc))) 0 d))))
选择最适合您需求的那个!