C语言—递归二分法查找

分治策略:分解的是规模,比如数10亿硬币,分成4万个人区完成,这样,问题不会改变,改变的是问题的规模

下面是不用递归求阶乘的方式

int fun(int n)
{
    int sum=1;
    for(int i=1;i<=n;i++)
    {
       sum=sum*(sum+1);
    }
}
void main{
int n,sum;
cin>>n;
sum=fun(n);
sum=fac(n);
}

这是递归的算法

int fac(n)
{
if(n<=1) return 1;
else return fac(n-1)*n;
}

fun(n)的时间复杂度是O(n),空间复杂度为O(1)是一个定值,不会随着i的范围变化开辟更大的内存空间。fac(n)的时间复杂度是O(n),空间复杂度为O(n)。所以在能用循环的时候尽量少使用递归。虽然递归的代码简洁。
系统默认给每个程序分配的栈大小为1M,有死循环之说,但是没有无限递归之说,如果递归要使用很多次时,要注意超出范围。
C语言—递归二分法查找_第1张图片
上图为一个无限递归的例子
下面是二分法查找的使用循环的操作

#define error -1
int binaryfindvalue(Seqlist&seq, const elemtype val)
{
	int left = 0;
	int right = seq.cursize-1;
	int mid;
	while (1)
	{
	    if (left < right)
		{
			return error;
		}	
		mid = (left + right) / 2;//如果担心数据范围超过int的最大范围
		                         //这里的式子改为(right -left+1)/2+left
		if (val < seq.data[mid])
		{
			right = mid - 1;
		}
		else if (val > seq.data[mid])
		{
			left = mid + 1;
		}
		else return mid;
			
	}
}

如果我们使用递归的做法,程序如下

int C_binaryfindvalue(Seqlist&seq, const elemtype val, int left, int right)
{
	if (left < right)
	{
		return error;
	}
	int mid = (right - left + 1) / 2 + left;
	if (val < seq.data[mid])
	{
		mid=C_binaryfindvalue(seq, left, mid - 1, val);
	}
	else if (val > seq.data[mid])
	{
		mid=C_binaryfindvalue(seq, mid+1, right, val);
	}
	else
	{
		while (mid>left&&seq.data[mid] == seq.data[mid - 1])//这样是如果数据中存在多个重复的数,需要输出第一位时的操作
		{
			mid--;
		}
	}return mid;
}

你可能感兴趣的:(C语言)