今晚这简单的一道题算是把我给难倒了,递归进去直接运行超时,出不来了。然后考虑用迭代,结果脑子直接坏掉,搞不清关系,硬是瞎折腾,好在最后还是搞出来了。
首先先来理解一下递归和迭代的基本概念
递归
- 程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小
- 递归的两个条件:
存在限制条件,当满足这个限制条件的时候,递归便不再继续
每次递归之后就会越来越接近这个限制条件
迭代
反复执行同一段代码,直到越来越接近结果,每重复一次就称之为一次“迭代”,每一次计算的结果都会作为下一次迭代的初始值来计算。
迭代需要注意的三个方面:确定变量,建立关系式,迭代过程(迭代结束条件)
// 计算1--100的和
int num =1;
for(int i=2;i<100;i++)
{
num=num+1;
}
代码中的对应的三个方面就是:
- 确定变量:num
- 建立关系式:num = num +1;
- 迭代的结束条件:i < 100
下面我们来看看看今天的主角—> 斐波拉契数列
题目描述
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
采用递归代码实现:
class Solution {
public:
int fib(int n) {
if(n==0||n==1)
return n;
int f0=0;
int f1=1;
for(int i=1;i<n;++i)
{
f1=f0+f1;
f0=f1-f0;
f1=f1%1000000007;
}
return f1;
}
};
// 2 3 5
f0=2;
f1=3;
f1=f0+f1;// 将5赋给f1
f0=f1-f1;// 将3赋给f0
此时
f0=3;
f1=5;
同理继续迭代
上面这两个语句就是迭代的主要语句,因为斐波拉契数列的特点就是 当前数字等于它前面两个数字之和。
总结
递归在解决一些问题时还是比较好用的,但是还是要注意它的递归结束的条件,因为递归是函数调函数,可能会出现进入死循环的情况,而且运算速度相比于迭代还是比较慢的,当然这个慢是相对于计算机而言的,我们人是感受不到的。