2011-06-15 43 views
3

我想计算Scheme中数字的位数之和。它应该是这样的:如何计算Scheme中一个数字的数字之和?

>(sum-of-digits 123) 
6 

我的想法是,以数量123转换为字符串"123",然后将其转换为一个列表'(1 2 3),然后用(apply + '(1 2 3))获得6

但它不幸没有像我想象的那样工作。

>(string->list(number->string 123)) 
'(#\1 #\2 #\3) 

显然'(#\1 #\2 #\3)不一样'(1 2 3) ......因为我使用的语言racket DrRacket下,所以我不能使用功能类似char->digit

任何人都可以帮我解决这个问题吗?

+0

生病了来查找INT - >字符串,字符串 - >列表的东西快,但我可以告诉你肯定'apply'心不是你想在这最后一步是什么。使用'fold'(左边或右边在这里没有关系),或者甚至可能有一个本地函数'sum' – 2011-06-15 15:48:48

+0

不,应用程序正常工作。 (应用+'(3 4))产生7 – 2011-06-15 16:09:48

+0

嗯,我想是的,我只是试过解释器。我从来没有真正想过应用这种方式,但我看到它现在如何适合。 – 2011-06-15 16:13:45

回答

6

另一种方法是通过使用模数来遍历数字。我不是用来方案语法,但这里的是,在Lisp的非负整数工作的功能(和一点点的工作可以包括小数和负值):

(defun sum-of-digits(x) 
    (if (= x 0) 0 
     (+ (mod x 10) 
     (sum-of-digits (/ (- x (mod x 10)) 10))))) 
+0

非常感谢!我已经改变根据方案语法'(定义(加总位数×) (如果(= X 0)0 (+(模×10)(加总位数(/(您的代码 - X( modulo x 10))10)))))' – bearzk 2011-06-15 16:23:10

+0

'defun'?你只需要从中获得乐趣,不是吗?? – BlackVegetable 2014-05-03 16:02:58

1

那些#\ 1,# \ 2的东西是人物。我讨厌RTFM你,但是Racket文档在这里真的很棒。如果您在DrRacket中突出显示字符串 - >列表并点击F1,则应该在浏览器窗口中看到大量有用的信息。

为了不让你在黑暗中;我想我可能会用“串”功能为您的解决方案缺少的一步:

(map string (list #\a #\b)) 

...产生

(list "a" "b") 
+0

谢谢:)你的解决方案符合我的想法。 – bearzk 2011-06-16 21:51:13

1

像这样的事情可以做你的事数字算术而不是串风格:

(define (digits n) 
    (if (zero? n) 
     '() 
     (cons (remainder n 10) (digits2 (quotient n 10)))) 

无论如何,IDK的如果你正在做什么,但这个问题让我觉得项目欧拉。如果是这样,你将在未来的问题中欣赏这两种功能。

以上是困难的部分,这是休息:

(foldr + (digits 12345) 0) 

OR

(apply + (digits 1234)) 

编辑 - 我摆脱intLength以上,但如果你还是想要它。

(define (intLength x) 
    (define (intLengthP x c) 
     (if (zero? x) 
      c 
      (intLengthP (quotient x 10) (+ c 1)) 
    ) 
    ) 
    (intLengthP x 0)) 
+0

'(如果(= N 0)“()...)' – 2011-06-15 16:12:41

+0

权利...前缀不缀= P感谢。当我正在做出这样的改变时,你建议我发现“零?”谓词。看起来像我也是一种过度谨慎与parens,现在修剪一些 – 2011-06-15 16:14:04

0

一个更好的想法是将实际找到数字,总结他们。 34%10给出43%10给出3。总和是3+4

下面是F#的算法(对不起,我不知道计划):

let rec sumOfDigits n = 
    if n<10 then n 
    else (n%10) + sumOfDigits (n/10) 
+0

感谢您的回答:) – bearzk 2011-06-16 21:51:45

0

这个工作,它建立在你最初与字符串>列表的解决方案,只是做在一个转换人物的名单

(apply + (map (lambda (d) (- (char->integer d) (char->integer #\0))) 
     (string->list (number->string 123)))) 

转换功能可以分解出来,使其多一点明确:

(define (digit->integer d) 
    (- (char->integer d) (char->integer #\0))) 

(apply + (map digit->integer (string->list (number->string 123)))) 
-1
(define (sum-of-digits num) 
    (if (< num 10) 
     num 
     (+ (remainder num 10) (sum-of-digits (/ (- num (remainder num 10)) 10))))) 

递归过程在..其中n < 10sum-of-digits返回输入num本身终止。

相关问题