标签:剑指offer c++
递归与循环
若我们要重复的多次计算相同的问题,通常可以选择用递归或者循环两种方法。
int AddFrom1ToN(int n) { int add = 0; for (int i = 1; i <= n; i++) { add += i; } return add; } int AddFrom1ToN(int n) { if (n <= 0) { return 0; } return n + AddFrom1ToN(n - 1); //return n<=0?0:n + AddFrom1ToN(n - 1); }
通常递归的代码比较简洁,但是由于它是函数调用自身,有时间的消耗和空间的消耗,且存在栈溢出的隐患
题目:
写一个函数,输入n,输出斐波那契数列第n项
f(N)= 0 N=0;
1 N=1;
f(N+1)+f(N-1) N>1
程序1.0
long long Fibonacci(size_t n) { if (n = 0) return 0; if (n = 1) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2); }
分析:
1.函数返回值类型为long long,防止数字太大溢出
2.若n过大则会导致栈溢出
程序2.0
时间复杂度O(n)
long long Fibonacci(size_t n) { if (0==n) return 0; if (1==n) return 1; long long first = 0; long long second = 1; long long result = 0; for (size_t i = 2; i <= n; i++) { result = first + second; first = second; second = result; } return result; }
测试
功能测试,输入2,4,6,8
边界值测试,输入0,1,2
3. 性能测试,输入50,70
1.一只青蛙跳台阶,一次可以跳一阶或两阶,计算这个青蛙跳n阶台阶有多少种跳法
分析:
(0阶0种跳法)若为1阶,只有一种跳发,两阶,有两种跳发,三阶3种。。。。
最后可看成是斐波那契数列的另一种延伸。
2.一只青蛙跳台阶,一次可以跳一阶,两阶,也可以跳n阶,计算这个青蛙跳n阶台阶有多少种跳法
经分析可得出一个数学公式 f(n)=2^(n-1)
3.我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形,8个2*1的小矩形无重叠覆盖一个2*8放的大矩形,共多少种方法
本文出自 “无以伦比的暖阳” 博客,请务必保留此出处http://10797127.blog.51cto.com/10787127/1772723
标签:剑指offer c++
原文地址:http://10797127.blog.51cto.com/10787127/1772723