我想知道是否有一种方法可以获取数字(数字)列表,并将这些数字一起截断为 Scheme 中的一个大数字(而不是加法)。例如,我想要
(foo '(1 2 3 4))
;=> 1234
Scheme 是否有内置函数来执行此操作?
我想知道是否有一种方法可以获取数字(数字)列表,并将这些数字一起截断为 Scheme 中的一个大数字(而不是加法)。例如,我想要
(foo '(1 2 3 4))
;=> 1234
Scheme 是否有内置函数来执行此操作?
Scheme 系列中有多种语言,Scheme 也有几个版本。如果您正在使用一个,例如,球拍,它包括一个左关联折叠(通常称为foldl
、fold
或reduce
,尽管也有其他变体),那么就折叠而言,这很容易实现。这些问题和答案中更详细地描述了折叠:
fold
将其视为迭代构造的描述(并且在要求尾调用优化的方案中被编译为迭代代码),还包括一个实现foldl
对于没有它的方案。reduce
提供比某些 Scheme 库中提供的更方便的接口的评论。以下是代码的样子foldl
:
(define (list->num digits)
(foldl (lambda (digit n)
(+ (* 10 n) digit))
0
digits))
> (list->num '(1 2 3 4))
1234
如果您的语言没有它,foldl
很容易编写(例如,我对上述问题之一的回答包括实现)并使用前面的代码,或者您可以自己编写整个函数(使用相同的方法) :
(define (list->num-helper digits number-so-far)
(if (null? digits)
number-so-far
(list->num-helper (cdr digits)
(+ (* 10 number-so-far)
(car digits)))))
(define (list->num digits)
(list->num-helper digits 0))
您可以使用命名使其更简洁let
:
(define (list->num digits)
(let l->n ((digits digits)
(number 0))
(if (null? digits)
number
(l->n (cdr digits)
(+ (* 10 number)
(car digits))))))