一些有关复杂度的问题

算出东西尽量记下来,不要重复计算啊!!

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;}
}

猜你喜欢

转载自blog.csdn.net/weixin_41677899/article/details/84452171