2012-10-11 46 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式)语法。