//O(n)intfunction1(int x,int n){int res =1;for(int i =0; i < n;++i){
res *= x;}return res;}
可以用递归,但复杂度仍为O(n)
//O(n) = 递归深度:n * 单层递归时间复杂度:O(1)intfunction1(int x,int n){if(n ==0)return1;//x的0次等于1return x *functionl(x, n -1);}
递归另一种写法,结果仍为O(n)
//相当于一棵满二叉树,一个结点代表进行了一次递归,所以递归次数为满二叉树的所有结点个数 = n - 1; 单层递归的时间复杂度是O(1);//O(n)= O(n) * O(1)intfunction1(int x,int n){if(n ==0)return1;if(n %2)returnfunctionl(x, n /2)*functionl(x, n /2)* x;elsereturnfunctionl(x, n /2)*functionl(x, n /2);}
优化版的递归:相当于把方法3的满二叉树优化为了一条线,每次n减半,结果是O(log n)
//可以看到方法3单层递归中做的4次递归都一样,因此提出来只做一次//O(logn)= 递归深度O(log n)* 单层递归的时间复杂度O(1)intfunction1(int x,int n){if(n ==0)return1;int t =functionl(x, n /2);//把相同操作提出来只做一次;每次使n减半,因此递归深度是log2 nif(n %2)return t * t * x;elsereturn t * t;}
求x的n次方思路:比较容易想到的是一层循环,不断更新res;//O(n)int function1(int x, int n) { int res = 1; for (int i = 0; i < n; ++i) { res *= x; } return res;}可以用递归,但复杂度仍为O(n)//O(n) = 递归深度:n * 单层递归时间复杂度:O(1)int function1(int x, int n) { if (n.