如何将列表转换为方案中的数字?

时间:2009-11-05 20:46:58

标签: scheme

喜欢转换(1 2 3 4)到1234~

6 个答案:

答案 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”这样的书价格低廉,阅读既简单又有趣,它让你在“计划模式”中思考。它将帮助您编写更简洁的解决方案。