递归函数,在于能够频繁调用自身,但递归函数需要一个确定的递归终止条件,即所谓的递归出口。而在递归函数中如果需要修改某个变量的值,则需要引入引用的问题。举个例子:
int find(int n, int *a, int low, int high)
{
int flagCand = 0;
int mid;
if(low < high)
{
mid = (low + high)/2;
if(a[i][mid] == data)
flagCand = 1;
else if(data < a[i][mid])
isInCandidate(i, data, a, low, mid - 1);
else
isInCandidate(i, data, a, mid + 1, high);
}
return flagCand;
}
可以看到,这是一个最简单的折半查找算法。但是这个算法事实上返回的结果是错误的!
因为我们在判断相等的时候改变了flagCand的值,但若这个改变存在于非顶层递归时,这个改变是无法记录下来的。在递归顶层时候,flagCand还是原来的值0。
解决这个问题的方法有两种:1、利用引用类型数据进行改变。2、利用全局变量改变flagCand的值。两种方法均可行,须依据实际例子来进行选择哪种方法为最优