2015-09-27 74 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