大家好,今天给大家带来查找数组中最大值的两种做法,这里的数组元素是自定义的而非随机值

先看一种相较好理解的方法

1.迭代

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int 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=%d\n", 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
#include <stdio.h>
int 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=%d\n", 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;
}

 若有更为优化的方法(如让最大值只打印一次),欢迎各位大佬点拨指正,对代码有不理解的地方也欢迎在评论区讨论!

今天的内容就到此为止啦!谢谢!预告一波递归大整理

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐