题目:
编写一个模板递归函数,确定元素 x 是否属于数组a [ 0 : n - 1 ]。
思路:
题目中没有说数组有序,那么默认为无序数组,应该用线性查找。同时是递归的,就应该从头或尾一个一个比较,相等时返回找到,否则递归调用函数,传入参数是数组,并且元素个数少一个。
函数退出的条件有两个:
1. 当由元素个数小于 0 时,说明目标元素不在数组中,没有找到。
2. 查找成功。
代码:
1 #include <iostream> 2 using namespace std; 3 4 template <typename T> 5 bool is_find (const T* a, int n, const T& target) { 6 if (n - 1 < 0) { 7 return false; 8 } 9 if (a[n - 1] == target) { 10 return true; 11 } else { 12 return is_find(a, n - 1, target); 13 } 14 } 15 16 int main() 17 { 18 int a[5] { 0, 1, 2, 3, 4 }; 19 int target; 20 cout << "Enter target : "; 21 cin >> target; 22 bool found = is_find(a, 5, target); 23 cout << "result : " << found << endl; 24 25 return 0; 26 }
代码中有几处需要说明:
1. 函数的边界条件为 n - 1 < 0。比如:数组 a,包含 5 个元素,但是最后一个元素下标是 4 。当数组还剩余 1 个元素时,下标为 0,这时 n - 1 = 0, 当数组中没有元素时,n - 1 = -1 < 0,表示没有找到。
2. 传入的数组声明为 const,因为不改变其元素;目标元素声明为const&,也是同样原因。