在Scheme中附加列表中的数字

时间:2014-10-30 15:06:58

标签: scheme

我正在学习计划,我遇到了一个示例问题。 将列表作为输入将每个元素转换为数字的数字,并按向后的顺序将列表转换为数字。例如 (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))
                           '()))))))

我试图使用(追加)并且在这种情况下不起作用,我不知道有任何替代方法将数字附加为数字?

1 个答案:

答案 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))))

选择最适合您需求的那个!