Scheme 在方案中添加列表中的数字

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

我目前正在学习这个计划,我遇到了一个例子问题。 将列表作为输入,将每个元素转换为数字的一位数,并按倒序排列列表。例如 (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 (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。这已经在其他问题中得到了回答,例如。