我该如何将列表中的两个整数合并成一个整数?(在Scheme中)
例如:
'(11 223) -> 11223
'(11 223) -> 11223
(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)))))
这是我在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对发布者可能意味着什么的解释,我错过了它。
有很多方法可以编写此过程,具体取决于您的计划。例如,如果列表可能包含超过两个数字(将来?),则可以按以下方式编写:
(define merge-numbers
(lambda (s)
(string->number
(apply string-append
(map number->string s)))))
现在你可以输入:
> (merge-numbers '(4 9 66 33 555 1))
4966335551
format
过程会更易读:(define merge-two-numbers
(lambda (s)
(string->number
(format "~a~a"
(car s)
(cadr s)))))
等等。
(string->number)
运行结果(原始问题中没有双引号,因此很可能OP想要数字结果)。 - blubberdiblub