1

我想知道是否有一种方法可以获取数字(数字)列表,并将这些数字一起截断为 Scheme 中的一个大数字(而不是加法)。例如,我想要

(foo '(1 2 3 4))
;=> 1234

Scheme 是否有内置函数来执行此操作?

4

1 回答 1

3

Scheme 系列中有多种语言,Scheme 也有几个版本。如果您正在使用一个,例如,球拍,它包括一个左关联折叠(通常称为foldlfoldreduce,尽管也有其他变体),那么就折叠而言,这很容易实现。这些问题和答案中更详细地描述了折叠:

  • 查找列表中两点之间的最大距离(方案)这个问题包括如何fold将其视为迭代构造的描述(并且在要求尾调用优化的方案中被编译为迭代代码),还包括一个实现foldl对于没有它的方案。
  • 展平列表列表这个问题是关于一个有点不寻常的折叠,以及如何使用它(或标准折叠)来展平列表。
  • 方案结构和列表这个问题有一个示例,说明如何调整传递给折叠的函数以实现稍微不同的行为。(我还包括一个固执己见的(但真实的;),我向你保证)关于 Common Lisp 如何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))))))
于 2013-10-23T23:41:05.667 回答