2012-10-11 76 views
2

我需要一個程序寫的程序的子程序,採用一個整數,比如說34109,並將其放入一個元素爲3,4,1,0,9的列表中。該整數可以是任意長度。有沒有人有這個技巧?我曾想過爲每個地方使用模數,但我認爲它不應該那麼複雜。計劃編號列表

+3

使用模數,這不是compilcated :)我不知道你的意思是'每個地方'。您只需用模10提取有效數字,將數字除以10,然後重複(也許遞歸)。 – piokuc

+0

嗨,感謝piokuc,這對於使用部門以及減少數量有意義。 – Matt

回答

3

最簡單的方法我能想到的是,通過使用算術運算和用於實現尾遞歸的named let

(define (number->list num) 
    (let loop ((num num) 
      (acc '())) 
    (if (< num 10) 
     (cons num acc) 
     (loop (quotient num 10) 
       (cons (remainder num 10) acc))))) 

或者,您也可以使用字符串操作解決這個問題:

(define char-zero (char->integer #\0)) 

(define (char->digit c) 
    (- (char->integer c) char-zero)) 

(define (number->list num) 
    (map char->digit 
     (string->list (number->string num)))) 

這可以被壓縮成一個單一的功能,但我相信它更容易理解,如果我們在子部分分割爲上述問題。

(define (number->list num) 
    (map (lambda (c) (- (char->integer c) (char->integer #\0))) 
     (string->list 
     (number->string num)))) 

反正結果如預期:

(number->list 34109) 
> '(3 4 1 0 9) 
+0

感謝您的'讓'解決方案 – demas

2

事情是這樣的:

(define (num2list-helper num lst) 
    (cond ((< num 10) (cons num lst)) 
     (else (num2list-helper (floor (/ num 10)) (cons (modulo num 10) lst))))) 

(define (num2list num) 
    (num2list-helper num '())) 

(num2list 1432) 

由於itsbruce評論,你可以躲在裏面最主要的一個輔助函數:

(define (num2list num) 
    (define (num2list-helper num lst) 
    (cond ((< num 10) (cons num lst)) 
      (else (num2list-helper (floor (/ num 10)) (cons (modulo num 10) lst))))) 

    (num2list-helper num '())) 

(num2list 1432) 

未完待續......

+0

變成一層一層。這是愚蠢的錯誤 – demas

+2

你可以通過使用名爲let裏面的num2list,而不是有一個外部幫手來保持事情的整潔。基本代碼將是相同的,但它將包含在需要幫助的功能中。只有擁有最高級別的理由是,如果您有多個需要此特定幫助的功能。 – itsbruce

+0

我已經更新了我的答案並隱藏了主幫助函數。但是我沒有設法在這段代碼中使用'let'或'lambda':(我遞歸調用num2list-helper,我不知道如何調用遞歸的匿名函數,所以如果你爲我分享這段代碼,我會很感激。 – demas

0

我不是人工循環的粉絲,所以這裏的基礎上展開(負載SRFI 1SRFI 26第一)的解決方案:

(define (digits n) 
    (unfold-right zero? (cut modulo <> 10) (cut quotient <> 10) n)) 

儘管這會返回一個空列表。如果你希望它返回(0)相反,我們添加一個特殊情況:

(define (digits n) 
    (case n 
    ((0) '(0)) 
    (else (unfold-right zero? (cut modulo <> 10) (cut quotient <> 10) n)))) 

當然,你也可以概括爲這樣其他基地。在這裏,我實現這個使用可選參數,因此,如果您沒有指定基數,則默認爲10:

(define (digits n (base 10)) 
    (case n 
    ((0) '(0)) 
    (else (unfold-right zero? (cut modulo <> base) (cut quotient <> base) n)))) 

不同的方案實現使用可選參數不同的語法;以上使用球拍式(和/或SRFI 89式)語法。