用球拍计算系列

时间:2015-09-27 18:18:37

标签: scheme 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,但这是处理这个问题的一种非常好的方法,谢谢!

3 个答案:

答案 0 :(得分:3)

你的定义似乎对我而言。空和的值为0,因此您返回正确的值。

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

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

答案 1 :(得分:1)

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

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

很难回答问题的数学部分,因为我不知道你在计算什么系列!

答案 2 :(得分: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的方式保存“状态”值。这是使用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)