2014-10-30 27 views
-1

我目前正在學習計劃,並且遇到了一個示例問題。 以列表作爲輸入將每個元素轉換爲數字的一個數字,而列表以倒序排列。例如 (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)) 
          '())))))) 

我試圖用(附加)和不在這種情況下不工作,我不知道有任何替代方式將數字附加爲數字?

+0

什麼是期望的輸出?一個列表是一個數字? – 2014-10-30 15:09:12

+0

一個號碼。輸入將是'(1 2 3 4)並且輸出是數字4321. – Ben 2014-10-30 15:15:44

+0

這已經在其他問題中得到了回答,例如[如何將列表轉換爲num在計劃?](http://stackoverflow.com/q /1281433分之1683479)。 – 2014-10-30 20:08:35

回答

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

挑最適合您的需求!

+0

我可能是錯的,但是這會輸出一個列表? – Ben 2014-10-30 15:16:22

+0

是的,OP剛剛更新了問題。我正在重寫這個...... – 2014-10-30 15:17:37

+1

謝謝解答所有問題! – Ben 2014-10-30 15:30:29