递归/分治策略 二分查找的递归与非递归

规模问题:分治策略,将一个难以解决的规模大的问题,分解成一些规模较小的相同问题

#include<iostream>
using namespace  std;
int fac(unsigned int n)//用递归解决阶乘
{
	if(n<=1)
		return 1;
	else
	{
		return fac(n-1)*n;
	}
}
int fun(unsigned int n)//用循环解决阶乘
{
	int sum =1;
	for(unsigned int i=1;i<=n;i++)
	{
		sum=sum*i;
	}
	return sum;
}
int main()
{
	int n, sum;
	cin>>n;
	//sum=fun(n);
	sum=fac(n);
	cout<<sum<<endl;

}
#include<iostream>
using namespace  std;
int fac(unsigned int n)//递归的斐波那契数列
{
	if(n<=2)
	{
		return 1;
	}
	else 
	{
		return fac(n-1)+fac(n-2);
	}
}
int fun(unsigned int n)//循环    斐波那契数列
{
	if(n<=0)
	{
		return 0;
	}
	if(n<=2)
	{
		return 1;
	}
	int a=1,b=1,c;
	for(unsigned int i=3;i<=n;++i)
	{
		c=a+b;
		b=a;
		a=c;
	}
	return c;
}
int main()
{
	int n,sum;
	cin>>n;
    //sum=fun(n);
	sum=fac(n);
    cout<<sum<<endl;

}
/*template<class _Con>

void PrintArray(const _Con&ibr)//对一切容器用他的迭代器打印
{
	//cout<<typeid(_Con).name()<<endl;
	typename _Con::const_iterator it = ibr.begin();
	for(;it!=ibr.end();++it)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
}*/
/*void PrintArray(const vector<int> &ibr)//只能打印 vector 其他容器不能打印只是打印值 打印出数组的值
 {
	 vector<int >::const_iterator it=ibr.begin();
	 for(;it!=ibr.end();++it)
	 {
		 cout<<*it<<" ";
	 }
	 cout<<endl;

}*/
template <class _II>
void PrintArray(_II  _F,_II   _L)//不但可以对容器也可以对数组打印
{
	for(;_F != _L;++_F)
	{
		cout<<*_F<<" ";
	}
	cout<<endl;
}
#include<iostream>
#include<vector>
using namespace  std;

template <class _II>
void PrintArray(_II  _F,_II   _L)//不但可以对容器也可以对数组打印
{
	for(;_F != _L;++_F)
	{
		cout<<*_F<<" ";
	}
	cout<<endl;
}
int FindValue(int br[],int n,int val)//数组退化成指针      二分查找
{
	int left=0,right=n-1;
	int pos=-1;
	while(left<=right)//说明区域中还有一个值,还要进行比较 是<=
	{
		//int mid = (left+right)/2;//可能会导致数据溢出
		int mid=(right-left+1)/2+left;//不会导致数据溢出
		if(val<br[mid])
		{
			right=mid-1;
		}
		else if(val>br[mid])
		{
			left=mid+1;
		}
		else
		{
			while(mid>left&&val==br[mid-1])//找第一个符合要求的数据
				--mid;
			pos=mid;
			break;
		}
	}
	return pos;
}
	int main()
{
	int ar[]={12,23,34,45,56,67,78,89,90,100};
	int n=sizeof(ar)/sizeof(ar[0]);
	vector<int > iar(ar,ar+n);
	PrintArray(iar.begin(),iar.end());
	int pos = FindValue(ar,n,23);
	cout<<pos<<endl;
	return 0;
}
int FindValue(int br[],int n,int val)//数组退化成指针      二分查找 非递归
{
	int left=0,right=n-1;
	int pos=-1;
	while(left<=right)//说明区域中还有一个值,还要进行比较 是<=
	{
		//int mid = (left+right)/2;//可能会导致数据溢出
		int mid=(right-left+1)/2+left;//不会导致数据溢出
		if(val<br[mid])
		{
			right=mid-1;
		}
		else if(val>br[mid])
		{
			left=mid+1;
		}
		else
		{
			while(mid>left&&val==br[mid-1])//找第一个符合要求的数据
				--mid;
			pos=mid;
			break;
		}
	}
	return pos;
	}
int SearchValue(int br[],int left,int right,int val)//二分查找递归形式
{
	int pos=-1;
	int mid=(right-left+1)/2+left;
	if(val<br[mid])
	
	{
		SearchValue(br,left,mid-1,val);
	}
	else if(val>br[mid])
	{
		SearchValue(br,mid+1,right,val);

	}
	else
	{
		while(mid>left&&br[mid-1]==val)
		{
			--mid;
			pos=mid;
		}
		return pos;
	}

}
int FindValue(int br[],int n,int val)
{
	if(NULL==br||n<1)
	{
		return -1;
	}
	return SearchValue(br,0,n-1,val);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值