1.对于规模较大且不能直接解决的问题,可先分解为若干个规模较小,相互独立且与原问题同质的子问题,合并子问题的解就可以得到原问题的解。使用递归的思想来解题。
适用的前提(必须同时具备两个特征)
1.原问题可以分解成若干个规模较小,相互独立且与原问题同质的子问题。
2.规模减小到一定程度时的子问题可以直接解决。
若子问题并不相互独立,可以使用动态规划来解决。
1.非递归解法
int main()
{
int n;
int arr[] = { 1,3,4,5,6,7,8,12,15,17 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("请输入要查找的数");
scanf("%d", &n);
int left = 0;
int right = sz - 1;
while (left <=right)
{
int mid = (left + right)/2;
if (n<arr[mid])
{
right= mid-1;
}
else if(n>arr[mid])
{
left = mid+1;
}
else if (n==arr[mid])
{
printf("找到那个数了,下标为:%d", mid);
break;
}
}
}
2.用递归的思想解决
int binary_search(int*arr,int left,int right,int n)
{
if (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] > n)
{
return binary_search(arr, left, mid - 1, n);
}
else if (arr[mid] < n)
{
return binary_search(arr, mid + 1, right, n);
}
else if (arr[mid] == n)
{
return mid;
}
}
return 0;
}
int main()
{
int n = 0;
int arr[] ={4,5,6,7,8,9,12,16,23,25};
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
printf("请输入要寻找的数字:>");
scanf("%d", &n);
int ret=binary_search(arr, left, right, n);
if (ret!=0)
{
printf("找到了,下标为:%d", ret);
}
else printf("找不到该数字");
}
程序运行的结果同上非递归的结果
问题1 全排列:求n个元素的全排列。以1,2,3三个元素为例,全排列结果为:
编写的程序如下:
void f(int a[], int j, int k)
{