作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在下面有一个递归函数。
int f(int n){
if(n<1) return 1;
else return f(n-1) + f(n-1);
}
最佳答案
天真递归
维基百科定义的Recursion:
递归是以自相似的方式重复项目的过程。
您的程序正在求解数学recurrence relation:
f(n) = f(n - 1) + f(n - 1)
f(n)
问题分解为越来越小的块,然后将这些问题分解为越来越小的块,依此类推。
f(0)
时会发生什么?因为在这种情况下,参数
n
为零,所以您的基本情况被触发,并且递归链停止。这是非常简单的情况(与所有
n < 1
一样):
f(0)
|
1
f(1)
怎么样?稍微复杂一点,但不多:
f(1)
/ \
f(0) + f(0) = 1 + 1 = 2
n = 5
:
_____________f(5)___________
/ \
___f(4)____ + ____f(4)____
/ \ / \
f(3) + f(3) + f(3) + f(3)
/ \ / \ / \ / \
f(2) + f(2) + f(2) + f(2) + f(2) + f(2) + f(2) + f(2)
/ \ / \ / \ / \ / \ / \ / \ / \
... ... ... ... ... ... ... ... = f(0) * 32 = 1 * 32 = 32
f(0) = 1
f(1) = 2
f(2) = 4
f(3) = 8
f(4) = 16
f(5) = 32
...
f(n) = 2ⁿ
f(n)
并且未命中基本情况时,会发生什么情况?计算f(n - 1)
,两次,。三重哎哟! return f(n - 1) + f(n - 1);
return 2 * f(n - 1);
int f(int n)
{
if(n < 1)
{
return 1;
}
else
{
return 2 * f(n-1);
}
}
O(n)
)直接向上递归版本。
std::map
的想法。
O(1)
!)查找。
int fib(int n)
{
if (n <= 1)
{
return n;
}
return fib(n - 1) + fib(n - 2);
}
O(2ⁿ)
)算法。但是,优化该算法并不像以前那么简单,因为无法以完全相同的方式简化
fib(n - 1) + fib(n - 2)
。但是,我们可以做的是添加一个数据结构,该结构旨在允许对程序预先访问预先计算的结果,并利用其避免大量的冗余计算。因此,优化的版本为:
long long fib_dp(int n)
{
if (lookup.find(n) != lookup.end())
{
return lookup[n];
}
else if (n <= 1)
{
return n;
}
lookup[n] = fib_dp(n - 1) + fib_dp(n - 2);
return lookup[n];
}
std::map<int, long long>
),仅对tad进行逻辑调整,然后将普通的
int
值替换为
long long
值,您便拥有了一个Fibonacci算法版本,可以处理更大的值。
n
,
更快。认真地,自己尝试一下并进行比较。天真的算法可能要花费数小时(或数天,甚至更多)才能完成,但动态编程版本却可以在几秒钟内完成。
n = 50
的输入。我的台式机包含Intel i7-4770K,并且相关进程当前正在使用约13%的CPU处理能力。快速动态编程版本在几秒钟内完成了输出
1125899906842624
。天真的递归版本在我输入时仍在工作,将近十二个小时。我想它将工作更长的时间(如果允许的话!)。
关于c - 大量递归函数背后实际上发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25221449/
我正在寻找匹配 /(?=\W)(gimme)(?=\W)/gi 或类似的东西。 \W 应该是零宽度字符来包围我的实际匹配项。 也许有一些背景。我想用添加的文字填充替换某些单词(总是 \w+),但前提是
如何在不使用 Intent 连接到 VPN 服务的情况下以编程方式检测流量是否正在通过 VPN。有系统调用吗? 最佳答案 这个有效: private boolean checkVPN() {
我是一名优秀的程序员,十分优秀!