递归和循环:
递归:是在一个函数的内部调用这个函数自身。
循环:是通过设置计算的初始值及终止条件,在一个范围内重复计算。
递归缺点:
- 函数调用的时间、空间消耗:每一次调用,都需要在内存栈里分配空间以保存函数参数、返回地址及临时变量。
- 递归中可能很多计算是重复的。
- 调用栈溢出:每个进程的栈的容量是有限的。若递归调用层级太多,就会超出栈的容量,导致栈溢出。
斐波那契数列
题目描述: 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。
Fibonacci定义如下:
f(n) = { 0 n=0;}
f(n) = { 1 n=1;}
f(n) = { f(n-1)+f(n-2) n>1;}
解题思路:递归效率低,使用迭代。从下往上计算,首先根据f(0)和f(1)算出f(2); 再根据f(1)和f(2)算出f(3), 依次计算, 主要是借助3个临时变量。
测试用例:
int main(){
//求10的斐波那契数列
int number = 10;
std::cout << "Number's fibonacci is: " << Fibonacci(number); //Output: 55
return 0;
}
Fibonacci函数实现:
long long Fibonacci(unsigned int n){ //无符号n
//临时数组,如果n为0或1时,可直接返回处理
int result[2] = {0, 1};
if(n < 2)
return result[n];
//三个临时变量
long long fibMinusOne = 1; //f(n-1)
long long fibMinusTwo = 0; //f(n-2)
long long fibN = 0; //f(n)
for(auto i = 2; i <= n; ++i){
fibN = fibMinusOne + fibMinusTwo;//初始执行n=2的情况
fibMinusTwo = fibMinusOne;
fibMinusOne = fibN;
}
return fibN;
}
题目二:一只青蛙依次可以跳上1级台阶, 也可以跳上2级。求青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路:实际上这是一个Fibonacci数列的例子, 使用公式f(n) = f(n-1) + f(n-2)便可求出跳一个n级的台阶有多少种跳法。