2009-11-05 64 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)))))))