我想在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)……因为我在DrRacket下使用的是language racket,所以不能使用像char->digit这样的函数。
有人能帮我解决这个问题吗?
发布于 2011-06-16 00:07:16
另一种方法是使用模数对数字进行循环。我不习惯使用方案语法,但这里有一个在Lisp中适用于非负整数的函数(稍加修改就可以包含小数和负值):
(defun sum-of-digits(x)
(if (= x 0) 0
(+ (mod x 10)
(sum-of-digits (/ (- x (mod x 10)) 10)))))发布于 2011-06-16 00:10:58
像这样的东西可以算术地做你的数字,而不是字符串样式:
(define (digits n)
(if (zero? n)
'()
(cons (remainder n 10) (digits2 (quotient n 10))))无论如何,如果这就是你正在做的,但这个问题让我想到了Project Euler。如果是这样的话,你将会在将来的问题中欣赏到这两个函数。
上面是最难的部分,下面是剩下的部分:
(foldr + (digits 12345) 0)或
(apply + (digits 1234))编辑-我去掉了上面的intLength,但如果你仍然需要它的话。
(define (intLength x)
(define (intLengthP x c)
(if (zero? x)
c
(intLengthP (quotient x 10) (+ c 1))
)
)
(intLengthP x 0))发布于 2011-06-16 00:09:09
这些#\1,#\2都是字符。我不想给你发短信,但是这里的球拍文档真的很棒。如果在DrRacket中突出显示string->list并点击F1,您应该会得到一个浏览器窗口,其中包含一系列有用的信息。
为了不让您蒙在鼓里,我想我可能会使用"string“函数作为您的解决方案中缺少的一步:
(map string (list #\a #\b))..。产生
(list "a" "b")https://stackoverflow.com/questions/6360516
复制相似问题