大家好,今天给大家带来查找数组中最大值的两种做法,这里的数组元素是自定义的而非随机值
先看一种相较好理解的方法
1.迭代
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int length; int arr[20] = {0}; int i, j; int a = 0; printf("请输入数组长度:n"); scanf("%d" , &length); for (i = 0; i < length;i++) { printf("请输入第%d个数字的大小:n", ++a); scanf("%d",&arr[i] ); } int max = arr[0]; for ( j = 0;j < length;j++) { if (max < arr[j]) { max = arr[j]; } } printf("最大值max=%dn", max); return 0; }
第一种相较简单,下面来看第二种
2.函数递归
其实这道题用递归并不是很典型,这里属于为了递归而递归了,首先将完整代码放出
下面将代码分成三部分进行说明
一、主函数部分
其中szcsh函数用于初始化数组,Max函数用于比较得出数组中的最大值
需要注意的是max的初始化在初始化数组后,这样可以将max初始化为数组中的第一个元素,便于比较。
二、szcsh函数(初始化数组)
注意count1和count2均为全局变量 !!1.其中count1用于记录输入数组中第几个元素,count2用于初始化数组,这里因为数组元素的下标从0开始,而输入的数字肯定是从第一个开始,故不能通过一个变量同时实现printf和scanf的功能。
2.
注意此处函数的定义返回类型为指针整型变量
这里稍作简单解释:
引用数组名时,如上图的arr,代表的其实是数组中第一个元素的地址,int arr[20]={};里的arr代表的是arr[0]的地址。又因为scanf传的是指针,也就是地址,所以下图第二行代码不需要&a
char a[10];
scanf("%s",a);
int b[10];
scanf("%d",&b[4]);
而第四行代码因为是对b数组中第五个元素赋值,因此需要&
综合以上我们知道了arr代表的其实是一个指针,因为返回类型也需要为指针类型!
也正是因为这里传的是指针,因此函数中形参的改变也就可以改变主函数中的实参,从而初始化arr[]
三、Max函数
}
j在main函数中初始化为1,又max已经初始化为数组中第一个元素,所以只需要从第二个元素开始比较, 即j为1时(j为数组下标)
判断当j为length时输出最大值
函数总输出结果:
注意,此处最大值打印了两次,假设数组长度为3,当j=2时,进行判断后函数递归进入Max,此时j+1变为3,判断后打印最大值,注意,此处打印后没有再次引用函数了!也就是说递归到此为止了,开始进行返回,因为j=2时调用函数时Max函数中的参数用到了++j,也就是先++再传参,那么此时j已经为3!继续向下判断,3=长度=3,故又打印了一次最大值,然后再返回上一级函数递归,i=1时,i++变为2,第二个判断不符合,因此不打印。
因为递归是层层递进的,调用时是一层一层,返回时也是一层一层,因此这里Max函数的返回类型并没有定义,用void定义了函数,下面是反例
可以看到如果Max函数采用return返回,输出的最大值是第二个元素,因为
只有第一次比较!!!!
后给max赋的值被最终传给了主函数,可以理解为深一层函数的值被浅一层函数返回的值覆盖了
因此这里最终还是用void定义了函数并在函数内部打印最大值(反例中在主函数打印)
最终代码
#define _CRT_SECURE_NO_WARNINGS 1 #includeint count1 = 0; int count2 = 0; int *szcsh(int length,int arr[])//完全初始化数组 { if (count1 < length) { printf("请输入第%d个数字的大小n", ++count1); scanf("%d", &arr[count2]); count2++; szcsh(length, arr); } return arr; } void Max(int length, int arr[],int j,int max) { if (j < length) { if (max < arr[j]) { max = arr[j]; Max(length, arr, ++j, max); } else { Max(length, arr, ++j, max); } } if (j == length) { printf("最大值max=%dn", max); } } int main()//寻找数组中的最大值 { int length;//数组长度 int arr[20] = { 0 }; int j = 1;//用于计算最大值所用的变量 printf("请输入数组长度:n");//自定义长度 scanf("%d", &length); szcsh(length, arr); int max = arr[0]; Max(length, arr,j,max); return 0; }
若有更为优化的方法(如让最大值只打印一次),欢迎各位大佬点拨指正,对代码有不理解的地方也欢迎在评论区讨论!
今天的内容就到此为止啦!谢谢!预告一波递归大整理



