在球拍中计算一系列
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)
好的,我先说这是一个硬件问题。话虽这么说,我不是在寻找答案,只是寻找答案的方向。
我必须计算直到 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)