Scheme语言:合并两个数字

5
我该如何将列表中的两个整数合并成一个整数?(在Scheme中) 例如:
'(11 223) -> 11223
3个回答

6
假设列表恰好有两个元素,并且都是数字:
(define (merge-numbers lst)
  (let ((1st (number->string (first  lst)))
        (2nd (number->string (second lst))))
    (string->number (string-append 1st 2nd))))

它符合预期:

(merge-numbers '(11 223))
> 11223

如果不使用let,可以选择以下方式:

(define (merge-numbers lst)
  (string->number
   (string-append
    (number->string (first  lst))
    (number->string (second lst)))))

1

这是我在2012年1月25日3:05给出的原始答案。它只处理了给定的测试。这是一个没有头脑的答案,很抱歉。

(define (merge ls) 11223)    
(merge '(11 223))

这是我的新答案,可以处理传递数字列表的所有情况。感谢blubberdiblub提供的指针! ; 零个或多个字符串的列表 -> 字符串 (define (merge-numbers ns) (if (null? ns) "" (let ((first-n (number->string (car ns))) (rest-ns (cdr ns))) (string-append first-n (merge-numbers rest-ns)))))

(merge-numbers '(11 223))
(merge-numbers '())
(merge-numbers '(1))
(merge-numbers '(1 2))
(merge-numbers '(1 2 3))
(merge-numbers '(1 2 3 4))
(merge-numbers '(1 2 3 4 5))

"11223"
""
"1"
"12"
"123"
"1234"
"12345"

由于原始问题可能意味着结果应该是一个数字,而这导致了一个字符串,因此需要使用string->number来获得最终答案。再次感谢blubberdiblub对发布者可能意味着什么的解释,我错过了它。


硬编码答案如何解决其他情况的问题? - blubberdiblub
是的,这样好多了,感谢您编辑您的答案 :) 您可能需要指出,如果需要数字而不是字符串作为结果,则可能需要通过(string->number)运行结果(原始问题中没有双引号,因此很可能OP想要数字结果)。 - blubberdiblub
感谢您再次提供指针 blubberdiblub。在尝试改进我的答案时,我最终采用了Mayer Goldberg的答案!我会添加那个注释。 - grettke

0

有很多方法可以编写此过程,具体取决于您的计划。例如,如果列表可能包含超过两个数字(将来?),则可以按以下方式编写:

(define merge-numbers
  (lambda (s)
    (string->number
      (apply string-append
        (map number->string s)))))

现在你可以输入:

> (merge-numbers '(4 9 66 33 555 1))
4966335551

如果你有一个真正需要数字2的理由,那么我认为使用format过程会更易读:
(define merge-two-numbers
  (lambda (s)
    (string->number
      (format "~a~a"
        (car s)
        (cadr s)))))

等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接