1、任何一个递归过程都可以转换成非递归过程。
2、对递归过程的优化一般手段为:尾递归优化。
尾递归:在每一次递归的过程中保持了上一次计算的状态,即线性迭代过程。
尾递归与一般递归不同在于对内存的占用:一般递归创建栈,累积后计算收缩,尾递归和迭代一样,只会占用恒量内存。
3、二叉树的前序遍历可以不用递归。(可以用迭代方式,或用栈)(1、)
4、一个递归算法必须包括:终止条件和递归部分。
5、递归函数最终会结束,那么这个函数一定:有一个分支不调用自身。
6、采用递归方式对顺序表进行快速排序。递归次数与每次划分后得到的分区处理顺序无关(长分区与短分区),与初始数据的排列次序有关。
7、对n个记录的线性表进行快速排序,为减少算法的递归深度,每次分区后,先处理较短的部分。
8、
int x(int n)
{
if(n<=3) return 1;
else return x(n-2)+x(n-4)+1;
}求x(x(8))需要计算几次x函数。关键点是画出树后,有x(n)的都算计算一次x函数 ,所以答案为18次。
9、一段楼梯台阶15级,小明一步最多只能跨3级,求小明登山这段楼梯有几种走法?
{ f(1)=1,f(2)=2;f(3)=4; n=1,n=2,n=3
f(n)= { f(n-1)+f(n-2)+f(n-3) , n>=4 意思为,n-1阶到n走一步,n-2阶到n走两步,n-3阶到n走3步。
(那n-2阶到n 还可以走两个1步啊?这个已经在n-1阶走1步里面了)
求得答案5768
10、递归函数的形参是 自动变量。是可以随着栈的销毁而销毁的。存储类型:auto;static;register;extern;
11、可以根据中序遍历和前序遍历,中序遍历和后序遍历构建二叉树,不能以前序遍历和后序遍历构建二叉树。
12、假设T(n)是解决一个有n个元素的问题的时间复杂度,T(n)=Θ(1),
如果n=1;T(n) = 2T(n/2) + Θ(n),
如果n>1;那么T(n)是Θ(nlogn)
折半查找: T(n) = T(n/2) + Θ(1) Θ(log(n))
二叉树遍历:T(n)=2T(n/2) + Θ(1) Θ(n)
归并排序: T(n)=2T(n/2) + Θ(n) Θ(nlog(n)) 传送门
13、
int ack(int m,int n)
{
if(m==0) return n+1;
else if(n==0) return ack(m-1,1);
else return ack(m-1,ack(m,n-1));
}
求ack(3,3)的值:61
14、int main () { fork() || fork() ; } 共创建几个进程 :3个进程
fork()在子进程中返回零值,给父进程返回非零值。
在main()中 第一个fork()返回了非零值,所以后面的fork()不执行 (如: 1 || 0 和1 || 1 都为1 ,不用管后面是几都是1,所以后面不执行)这里创建了一个。
fork()在子进程中复制了main父进程,第一个fork()的子进程中也是fork()|| fork() 因为在子进程中是0值,所以还要执行后一个fork(),这里创建了两个。
合计:三个进程。
15、求最大公约数的递归调用问题:
int gcd(int i, int j)
{
int r = i % j;
return r == 0 ? j : gcd(j, r);
}
16、汉诺塔递归调用问题:传送门
主要是吧问题分为3种情况,假设A,B,C三个塔
(1)把n-1个盘子从A移到B(从A,借助C,放到B)
(2)第n个盘子从A移到C(把最大的盘子放到C上)
(3)把n-1个盘子从B移到C(从B,借助A,放到C)
本文探讨了递归算法的基本概念及优化方法,包括尾递归优化、递归转非递归的过程,以及递归在典型问题如快速排序、二叉树遍历中的应用。同时,文章还介绍了递归算法中的关键组成部分,如终止条件与递归部分。
228

被折叠的 条评论
为什么被折叠?



