算出东西尽量记下来,不要重复计算啊!!
1.计算a^n f(a,n) 用递归的方法
package fads;
public class af {
public static int f(int a,int n)
{
if (n==0) return 1;
else
{
if((n&1)==0)//偶数 (n&1)==0 加括号
{int m=f(a,n/2);
return m*m; }
else
{int m=f(a,(n-1)/2);
return m*m*a;}
}
}
public static int f2(int a,int n)
{
if (n==0) return 1;
else
{
if((n&1)==0)//偶数 (n&1)==0 加括号
{
return f(a,n/2)*f(a,n/2); }
else
{
return f(a,(n-1)/2)*f(a,(n-1)/2)*a;}
}
}
public static void main(String[] args) {
for(int i=0;i<6;i++)
System.out.println(f(3,i));
}
}
我们注意f和f2的区别,
f由于用m记下值,所以复杂度Ο(log n)
f2没有记下值,重复计算,复杂度Ο(n)
2^ n=2^ (n-1)+2^(n-1)
利用该式来计算2^n
下面是伪代码
第一种写法,加法复杂度是Ο(2^n)
第二种,加法复杂度是Ο(n)
Algorithm Power(int n)
{
if n = 0 return 1;
else return Algorithm Power(n − 1) + Algorithm Power(n − 1);}
Algorithm Power2(int n)
{if n = 0 return 1;
else
{int m=Algorithm Power(n − 1);
return m+m;}
}