如何解决f(n)=(1-f(n-1))*c+f(n-1), 其中 f(0)=c 的递推解应该是什么?
我有一个公式需要编码。
但等式的形式为 f(n)=(1-f(n-1))*c+f(n-1)
,
where f(0)=c
。
现在,它与斐波那契数列非常相似,因此很明显它需要指数级的时间并减慢我的整个过程。
那么,我如何在理论上设计递归解决方案并找到有效代码结构的替代方法?
解决方法
该公式不像斐波那契,因为它只取决于前一个结果,而斐波那契数列则取决于前两个项。
首先,您应该将方程转换为前一项只出现一次,而不是两次。这是给出的:
?? = (1 − ??−1)? + ??−1
但这可以改写为:
?? = (1 − ?)??−1 + ?
现在让我们从基本情况开始分析这个公式是如何展开的:
?0 = ?
?1 = (1−?)?0 + ?
= (1−?)? + ?
?2 = (1−?)?1 + ?
= (1−?)[(1−?)? + ?] + ?
= (1−?)2? + (1−?)? + ?
?3 = (1−?)?2 + ?
= (1−?)[(1−?)2? + (1−?)? + ?] + ?
= (1−?)3? + (1−?)2? + (1−?)? + ?
...
?? = ∑?=0..?(1−?)k?
= ?∑?=0..?(1−?)k
总和是 geometric series,所以我们可以写:
?? = ?(1 − (1−?)?+1) / (1 − (1−?))
= 1 − (1−?)?+1
显然,这很容易编程为 O(1) 算法。
这种复杂性假设算术运算在所选的编程语言中花费恒定的时间。但是,如果要使用任意大(大)整数,则这些算术运算不需要恒定时间。
, f(n) = (1-f(n-1))*c + f(n-1)
= c - c*f(n-1) + f(n-1)
= c + (1-c)*f(n-1)
这不是指数,也与斐波那契数列不同。它的格式为:f(n) = a*f(n-1) + b
您可以直接实现这一点,这将是线性时间(对函数 O(n)
进行 f
次调用)。
或者,您可以通过求解线性一阶递推关系将方程简化为直接表达式,这将得到:
f(n) = 1 - (1-c)^n + c*(1-c)^n
可以在O(1)
中计算
我只能给你递归代码。
c = 2 # You can use any number.
def algorithm(num):
if not num: return c #(returns c if num == 0
fminus1 = algorithm(num - 1)
return (1 - fminus1) * c + fminus1
,
这个递归解决了
f(n) = -(1 - c)n+1 + 1.
要知道为什么,让我们首先注意到递归步骤可以重写为
f(n) = (1 - c)f(n - 1) + c。
这是一个线性异质递推关系。为了解决它,我们首先解决相关方程
f(n) = (1 - c)f(n - 1)
得到一般解 f(n) = a(1 - c)n。
接下来,我们寻找一般复发的任何解决方案
f(n) = (1 - c)f(n - 1) + c
并将其添加进去。我们将猜测答案的形式为 s,因为这通常是这些事情的工作方式,然后求解方程
f(n) = (1 - c)f(n - 1)+ c → s = (1 - c)(s) + c
这意味着
s = (1 - c)s + c
s - (1 - c)s = c s(1 - 1 + c) = c
cs = c
s = 1
所以解的一般形式将是 a(1 - c)n + 1。求解边界条件 f(0) = c 给出
a(1 - c)0 + 1 = c
a + 1 = c
a = c - 1
所以递归求解为
f(n) = (c - 1)(1 - c)n + 1,
或
f(n) = -(1 - c)n+1 + 1.
让我们试试这个。对于 c = 0,我们得到 f(n) = -1n + 1 = 0,我们有
- f(0) = 0
- f(1) = (1 - 0)f(0) + 0 = 0
- f(2) = (1 - 0)f(1) + 0 = 0
- …
对于 c = 1,我们有 f(n) = -(1 - 1)n + 1 = 1,我们有
- f(0) = 1
- f(1) = (1 - 1)f(0) + 1 = 1
- f(2) = (1 - 1)f(1) + 1 = 1
- …
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。