2015-09-27 54 views
2

好的,我会先说这是一个hw问题。话虽如此,我并没有在寻找答案,只是答案的一些方向。计算球拍中的一个系列

我得计算一系列高达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

变化'(= N-1)''到(= N 0)',你会得到预期的结果。 – soegaard

+0

@soegaard如果要将基本情况测试从-1更改为0,他们还必须将基本情况更改为1 ;-) –

+0

好点。错过了。 – soegaard

回答

3

你的定义对我来说似乎是正确的。空总和的值是0,所以你正在返回正确的值。

您的解决方案是使用递归的规范。使用for/sum另一种看起来像这样:

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

已更新答案以产生预期答案。 – soegaard

1

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

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

很难回答问题的数学部分,因为我不知道你计算的是哪个系列。

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) 
+0

请注意,数学库中的阶乘缓存结果(达到极限)。 – soegaard