Scheme 在方案中添加列表中的数字
我目前正在学习这个计划,我遇到了一个例子问题。 将列表作为输入,将每个元素转换为数字的一位数,并按倒序排列列表。例如 (4201)=>1024,(399)=>993等 我已经有了基本结构:Scheme 在方案中添加列表中的数字,scheme,Scheme,我目前正在学习这个计划,我遇到了一个例子问题。 将列表作为输入,将每个元素转换为数字的一位数,并按倒序排列列表。例如 (4201)=>1024,(399)=>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
(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))
'()))))))
我试图使用(追加),但在这种情况下不起作用,我不知道有什么替代方法可以将数字追加为数字?您不能使用列表操作将数字构建为输出,
追加
用于追加列表,而不是数字。请改用基本算术运算:
(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))))
选择一个最适合你的需要 期望的输出是什么?一张单子,一个号码?一个号码。输入是“(1 2 3 4),输出是数字4321。这已经在其他问题中得到了回答,例如。