递归专题

来源:互联网 发布:日本对中国文化知乎 编辑:程序博客网 时间:2024/05/29 16:08

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)

                


0 0
原创粉丝点击