C语言递归习题--(2)

本文是C语言递归习题的第二部分,涵盖三个经典问题:找出数组中的最大值,将整数反向输出,以及实现折半查找。每个问题都通过引导、分析、代码展示了解决思路,利用递归逐步拆分问题直至找到解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

前几天发布第一部分,今天是第二部分,谢谢大家支持。

题目

(一)找出数组最大值问题:

引导:

在数组里找出最大值,我们将问题拆开来考虑
假设数组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;
}

以上是第二部分,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值