玩转递归(c语言)

递归

关于递归算法,大概分为两种。一种是基于分治策略的递归,一种是基于回溯策略的递归。今天主要给大家分享几段关于分治策略的递归算法。我也深知自己学疏才浅,不到之处在所难免,各位同道也多多指教。

一、累加

1、不用递归的情况下,实现1~100的累加。

int main()
{
	int sum=0;//定义一个sum,存放累加的值
	for(int i = 1; i < =100 ; i++){//实现1~100的累加,因此for循环的范围是1~100
		sum+=i;//每循环一次把i累加至sum
	}
	printf("sum=%d",sum);//打印输出
return 0;
} 

2、用递归的思想,实现1~100的累加。

int cumulative(int x,int y)
{
	if(x > y) return 0;//如果x>y,说明x已经加到最后一项,则返回0
	//找递归的出口
	return x + cumulative( x+1 , y );//只要x不大于y,说明还没有加到最后一项,则继续递归
	//找到相似问题
} 
int main()
{
	printf("sum = %d\n",cumulative( 1 , 100 ));//打印输出1~100的累加
return 0;
}

二、找数组中的最大值

1、不用递归,找最大值的情况。

int main()
{
	int num[10] = {13,15,21,8,10,5,25,30,12,9};
	int max = num[0];//把数组第一个元素先赋值给max
	for(int i = 1 ; i < 10 ; i++)//数组下标1~9
		if(num[i] > max) max = num[i];//循环过程中,把相对大的数赋值给max
	printf("max = %d\n",max);//循环结束后,max中的值就是数组元素中的最大值
}
*直接通过循环找数组中最大值很简单,以上代码不做过多的解释了。*

2、用递归的方法找数组中最大值。

如何来设计相应的递归算法?
目标:max{a[0], a[1], … a[n-1]}
可分解为:max{a[0], max{a[1], … a[n-1]}}
另外已知max{x} = x
这就是递归算法的递归形式和递归边界,据此可以编写出相应的递归函数。

int num[10] = {13,15,21,8,10,5,25,30,12,9}; //定义一个全局变量数组
int max = num[0];//定义一个全局变量,用来存放最大值,将初值赋为数组num的第一个元素
int max_num(int i ,int j){
	if(num[i] > max)
		max=num[i];//找相似问题
	if(i==j) return max;
	//找递归的出口,如果i==j,那么说明该数组已经全部查找完毕,直接返回最大值max
	return max_num(i+1,j);//递归调用

}
int main()
{
	printf("max = %d\n",max_num(  0 , 10 ));//打印
}

三、汉诺塔

题目:
相传在古印度Bramah庙中,有位僧人整天把三根柱子上的金盘倒来倒去,原来他是想把64个一个比一个小的金盘从一根柱子上移到另一根柱子上去。移动过程中遵守以下规则:每次只允许移动一只盘,且大盘不得落在小盘上(简单吗?若每秒移动一只盘子,需5800亿年)

在做这题之前,我们可以去网上把这个游戏先玩一玩。下面是我做的一个关于汉诺塔的分析图。

在这里插入图片描述
代码如下:

#include<stdio.h>
void hanota(int num_cen,char a,char b,char c){
	if(num_cen==1)
		printf("num:%d::%c->%c\n",num_cen,a,c);//把a上的放到c上 
	else{
		hanota(num_cen-1,a,c,b);//通过c把a上的放在b上 
		printf("num:%d::%c->%c\n",num_cen,a,c);
		hanota(num_cen-1,b,a,c);//b通过a移到c上 
	}
}
int main(){
	char a='A',b='B',c='C';
	int num_cen;
	printf("请输入一个整数:\n");
	scanf("%d",&num_cen); 
	hanota(num_cen,a,b,c);
	return 0;
}

调试效果:
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值