如何在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)
...不一样,因为我在DrRacket下使用的语言是
racket
,因此我无法使用like10ѭ之类的函数。 谁能帮我解决这个问题?     
已邀请:
        另一种方法是使用模数在数字上循环。我不习惯语法语法的设计,但是这是一个在Lisp中用于非负整数的函数(做一点工作就可以包含小数和负值):
(defun sum-of-digits(x) 
  (if (= x 0) 0 
      (+ (mod x 10) 
         (sum-of-digits (/ (- x (mod x 10)) 10)))))
    
        那些#\\ 1,#\\ 2都是字符。我讨厌RTFM,但是Racket文档在这里确实很棒。如果您在DrRacket中突出显示string-> list并单击F1,则应该获得一个包含大量有用信息的浏览器窗口。 以免使您陷入黑暗;我认为我可能会使用\“ string \”函数作为解决方案中缺少的步骤:
(map string (list #\\a #\\b))
...产生
(list \"a\" \"b\")
    
        这样的事情可以算术地而不是字符串样式地处理数字:
(define (digits n)
    (if (zero? n)
        \'()
        (cons (remainder n 10) (digits2 (quotient n 10))))
无论如何,如果您正在执行idk,但这个问题使我想到了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))
    
        一个更好的主意是实际找到这些数字并求和。
34%10
给出
4
3%10
给出
3
。总和是
3+4
。 这是F#中的算法(很抱歉,我不知道Scheme):
let rec sumOfDigits n =
    if n<10 then n
    else (n%10) + sumOfDigits (n/10)
    
        这有效,它建立在您最初的string-> list解决方案的基础上,只是对字符列表进行了转换
(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))))
    
        
(define (sum-of-digits num)
    (if (< num 10)
        num
        (+ (remainder num 10) (sum-of-digits (/ (- num (remainder num 10)) 10)))))
递归过程..终止于
n < 10
,其中
sum-of-digits
返回输入
num
本身。     

要回复问题请先登录注册