在球拍中计算一系列

Computing a series in racket

好的,我先说这是一个硬件问题。话虽这么说,我不是在寻找答案,只是寻找答案的方向。

我必须计算直到 n 的序列。我最初的想法是使用递归,然后做类似下面的事情

(define (series-b n)
  (if (= n -1) 0 ; Not sure how to handle this
    (+ (/ (expt -1 n) (factorial n)) (series-b (sub1 n)))
  )
)

这似乎是执行此操作的方法。但是,我不太确定如何处理 -1 情况,这让我失去了预期的答案。提前致谢。

编辑

我确实有一些测试用例,它们如下

n = 0: 1
n = 1: 1/2
n = 2: 2/3
n = 3: 5/8
n = 4: 19/30
n = 5: 91/144

我也不完全确定那是哪个系列。

编辑 2

我选择了 soegaard 的答案,但是,我确实对最终解决方案做了一个小改动,即:

(define (series-b n)
  (for/sum ([i (+ n 1)])
      (/ (expt -1 i)
         (factorial (+ i 1))))
)

接受的答案使用 (factorial i) 而不是 (factorial (+ i 1))。我还不熟悉 for/sum,但这是处理此问题的一种非常好的方法,非常感谢!

你做得很好,我认为你很接近。

首先编写一些测试用例。确保包含基本案例的测试用例。

这个问题的数学部分很难回答,因为我不知道你计算的是什么级数!

你的定义对我来说似乎是正确的。空总和的值为 0,因此您返回的是正确的值。

您的解决方案是使用递归的规范解决方案。使用 for/sum 的替代方案如下所示:

(define (series-c n)
  (for/sum ([i (+ n 1)])
    (/ (expt -1 i)
       (factorial (+ i 1))))

您可以将这个系列实现为 SRFI 41 流!

(require srfi/41)
(define negatives (stream-cons -1 (stream-map sub1 negatives)))
(define terms (stream-cons 1 (stream-map / terms (stream-cdr negatives))))
(define series (stream-cons 1 (stream-map + series (stream-cdr terms))))

用法示例:

> (stream->list 10 series)
(1 1/2 2/3 5/8 19/30 91/144 177/280 3641/5760 28673/45360 28319/44800)

不喜欢直播?我喜欢 soegaard 的回答,除了它每次都必须重新计算阶乘!我希望 for/sum 能够像 for/fold 那样保存 "state" 值。这是使用 for/fold:

的实现
(define (factorial-series n)
  (define-values (sum _)
    (for/fold ((sum 0) (value 1))
              ((i (in-range -2 (- -3 n) -1)))
      (values (+ sum value)
              (/ value i))))
  sum)

用法示例:

> (map factorial-series (range 10))
(1 1/2 2/3 5/8 19/30 91/144 177/280 3641/5760 28673/45360 28319/44800)