微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

f(n)=(1-f(n-1))*c+f(n-1), 其中 f(0)=c 的递推解应该是什么?

如何解决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 举报,一经查实,本站将立刻删除。