前言:
前几天发布第一部分,今天是第二部分,谢谢大家支持。
题目
(一)找出数组最大值问题:
引导:
在数组里找出最大值,我们将问题拆开来考虑
假设数组int a[] = { 15,2,20,12,10,8};如果我将这数组分成两部分,即a[5]和a[0-4],如果判断a[5]比max(a[0-4])还大,那a[5]就是最大的,反之在a[0-4]找出最大的还是按照上面的步骤分成两部分。这样将问题一步步分解的思路又是递归的思路,所以使用递归解决。
分析:
已知:显然,一个数组如果只有一项我们根本没有必要判断最大值,所以直接输出,写在 if 语句中
未知:我们通过比较a[5]和max(a[0-4])哪个大,这我们不知道所以写在else在这里a[5]和a[0-4]哪个大还有两种情况分开讨论,若果a[5]大输出a[5]反之找出a[0-4]最大值。
参数:我们要查找的数组,所以需要数组,并且我们是将数组一点一点拆分,所以需要一个变量代表数组的长度
代码:
#include<stdio.h>
int max(int a[], int n)//设一个max的方法传入数组a和数组最下标(或数组元素个数-1)
{
if (n==0)
return a[n];
else
{
if (a[n] > max(a, n - 1))
return a[n];
else
return max(a, n - 1);
}
}
int main()
{
int a[] = { 15,2,20,12,10,8};
printf("%d", max(a, 5));
return 0;
}
(二)将一个整数反向输出
引导:
我们将一个大于十位的整数,如果用非递归的方法使用一个循环,将他取余再除10,直到整数为零。我们来分析一下,我们从多位的整数,一步一步减小,将他们一个一个输出,这种一步一步减小问题的思路,也符合递归的思路,所以递归没问题。
分析:
已知 :如果这个整数是各位数,那么就直接输出就行
未知 :当这个整数不是个位数,那么我们将取余输出,再找他减小1/10的逆序
参数 :在整个方法中,只是对输入的整数进行拆分,所以只有一个变量用于传入数据。
代码:
#include<stdio.h>
void num(int n)
{
if (n / 10 == 0)
printf("%d", n);
else
{
printf("%d",n % 10);
num(n / 10);
}
}
int main()
{
int n ;
scanf_s("%d", &n);
num(n);
return 0;
}
(三)折半查找问题
引导:
折半查找问题,我们将有序序列一分为二,用中间的值与我们需要寻找的值相比较,如果寻找的值比中间的值大,那就以后半段再一半,反之就在前半段找。我们可以看到我们将一个有序序列不停一分为二,将问题逐步拆分,很符合递归的思想。所以可以用递归来解决这个问题。
分析:
上面分析了主要思路现在我们分析那些事 已知(事先保证要查找的元素在有序序列中):如果要找的元素就在有序序列的中间位置,那么不用再递归直接输出位置。
未知:当中间的元素比查找元素大,那么就返回前半段,反之返回后半段。在 参数 问题,我们首先要有有序数组,其次是要查找的元素,如何控制前半段还是后半段,就用两个值去作为数组查找的区间。
代码:
#include<stdio.h>
int num(int a[], int from,int end, int found)
{
if (a[(from+end) / 2] == found)
return (from + end) / 2;
else
{
if (a[(from + end) / 2] > found)
return num(a, from,(from + end)/2, found);
else
return num(a,(from + end)/2,end, found);
}
}
int main()
{
int i;
int a[] = { 0,1,2,3,4,5,6,7,8,9 };
scanf_s("%d", &i);
if (i > a[9])
printf(" no found");
else
printf("在第%d个位置", num(a, 0, 10, i)+1);
return 0;
}
以上是第二部分,谢谢。