0507数据结构

1.实现一个链表的逆置

  • 方法一:尾插逆置,用两个指针,q,r,r用于标记原来链表的末尾,q用于标记尾插后的结点,每次将头结点的下一个结点尾插到链表结尾,直到L的下一个结点为s,就完成了对链表的逆置。
  • 方法二:头插法逆置,用两个指针p,q,p指针标记每次头插的结点,q指针指向待逆置的结点,每次将q指针指向的结点头插到链表中,直至q指向的结点为空则完成链表的逆置。

2.递归的含义,递归能不能替代循环,递归是怎么实现的

  • 递归即函数自身调用自身,本质上是自上而下解决问题,将大问题解决成小问题。递归有两个基本要素,即边界条件和递推关系。
  • 递归与循环各有优缺点,递归的思路清晰代码实现简单,但递归的实现需要用到栈,每一次递归都需要用栈保存参数、返回地址和临时变量,同时会造成很多的重复计算,比如斐波那契数列的递归算法,同时当数字很大时还可能会造成栈溢出。而循环则更高效,结构简单,但是对于有些问题,使用循环会比递归更加复杂,比如二叉树的前中后序遍历。
  • 递归的实现:递归通过栈实现,需要将每一层的变量状态等压入栈中,直到满足边界条件,再返回其父方法执行。
  • 想到中断嵌套,但是递归和中断嵌套是不一样的概念,中断嵌套是系统在遇到更高优先级的中断提出请求时,会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套。
  • 中断处理的流程:首先,每一个中断都被进行了编号,即中断向量,不同的中断向量对应不同的中断处理程序。当程序执行完当前的每一条指令之后,都会区检查由没有中断请求,如果有,就在相应的脉冲到来之前读取中断向量,通过中断向量查看优先级,找对应的栈等(参考https://www.cnblogs.com/aaronLinux/p/10842499.html),然后保存当前程序的现场,跳到中断服务程序处理中断,当中断服务程序执行完毕后,恢复先前中断的程序。

3.斐波那契数列算法,使用递归和迭代方法的区别

  • 斐波那契额数列的应用:有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?

这就是一个斐波那契数列:登上第一级台阶有一种登法;登上两级台阶,有两种登法;登上三级台阶,有三种登法;登上四级台阶,有五种方法……所以,1235813……登上十级,有89种。

  • 斐波那契数列公式  F(n)=F(n-1)+F(n-2)(n>2) F(0)=0  F(1)=1 F(2)=1
  • 算法思想:采用递归方式的话效率很低,因为会有很多重复计算,可以采用迭代的方法,根据F(0)和F(1)计算出F(2),以此类推,可以计算出第n项,时间复杂度为O(n),(用long long数据类型,否则数字大时精度不够)
 1 long long Fibo(unsigned n)
 2 {
 3    int result[2]={0,1};
 4    if(n<2)
 5       return result[n];
 6    long long FiboOne=0;
 7    long long FiboTwo=1;
 8    long long FiboN=0;
 9    for(unsigned int i=2;i<n;i++)
10    {
11          FiboN=FiboOne+FiboTwo;
12          FiboOne=FiboTwo;
13          FiboTwo=FiboN;
14    }
15    return FiboN;
16 }
View Code
原文地址:https://www.cnblogs.com/helloworldToDu/p/12843584.html