好的,我首先要说这是个问题。话虽这么说,我不是在寻找答案,只是答案的一些方向。
我必须计算最多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 :(得分: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)