2009-11-05 59 views

回答

2

这听起来像一个家庭作业的问题...

想想10的幂,什么在一些每个数字:1234其实就是。

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))))) 
+0

虽然'expt'是后者的名字,''length'和'power'已经在Scheme中定义。 – 2009-11-06 07:14:07

1

既然你已经发布你的工作的解决方案,我会后这一点。 如果你不能使用let,你可以用辅助函数做类似的事情。

(define (list->num l) 
    (let loop ((n 0) (l l)) 
    (if (empty? l) 
     n 
     (loop (+ (* 10 n) (car l)) (cdr l))))) 

一本书像“小策士”价格低廉,容易和有趣的阅读,它真的让你在“计划模式”的思想。它将帮助您编写更简洁的解决方案。

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

下面是一个使用仅尾递归

(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))))))) 
2

这里有两个溶液从我的Standard Prelude功能,在数字和数字列表之间进行转换;都采用可选参数来指定要使用的基数。它们使用标准的R4RS计划编写,并应在任何最新的计划系统中工作。

(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)))))))