C语言之递归

本文介绍了递归的基本概念和三个经典示例:计算阶乘、求等差数列和及解决汉诺塔问题。通过C语言代码展示了递归在解决这些问题时的应用,强调了递归的终止条件、数据规模递减和可解性三大要素。


前言

本文根据郝斌老师的教导记录此文章


一、递归满足三个条件

1、递归必须得有一个明确的终止条件。
2、该函数所处理的数据规模必须在递减。
3、这个转化必须是可解的。

二、递归的示例

1.n的阶乘

代码如下(示例):

#include <stdio.h>

long JieCheng(long n);

int main(void) {
	int i;
	printf("请输入一个数:");
	scanf("%d", &i);
	printf("%d的阶乘是:%ld\n", i, JieCheng(i) );


	return 0;
}

long JieCheng(long n) {
	if(1 == n) {
		return 1;
	}
	else {
		return JieCheng(n-1) * n;
	}
}

结果显示:
在这里插入图片描述

2.求1+2+3+…+100的和

代码如下(示例):

#include <stdio.h>

int func(int n);

int main(void) {
	int n = 100;
	printf("1+2+3+...+100 = %d\n", func(n));


	return 0;
}

int func(int n) {
	if( 1 == n ) {
		return 1;
	} else {
		return func(n-1) + n;
	}

}

结果显示:
在这里插入图片描述

3.汉诺塔

描述:假设有三个柱子,分别是A,B,C,然后有三个盘子都在A柱子上,现在要把A柱子的盘子移动到C柱子上。

过程图:
在这里插入图片描述

代码如下(示例):

/*
 * 题目:汉诺塔 
 * 目标:有三个柱子,A B C。有n个盘子放在A柱子上,然后把A柱子的盘子转移到C柱子上
 * 要求:每次只能移动一个盘子;一开始,盘子在A柱子上由大到小排序,最大的盘子放在最下面
 * 
*/

#include <stdio.h>

void hannuota(int n, char A, char B, char C);

int main(void) {
	char ch1 = 'A';
	char ch2 = 'B';
	char ch3 = 'C';
	int n;

	printf("请输入要移动盘子的个数:");
	scanf("%d", &n);
	hannuota(n, 'A', 'B', 'C');

	return 0;
}

void hannuota(int n, char A, char B, char C) {
/*
 * 如果是一个盘子
		直接将A柱子上的盘子从A移到C
   否则
		先将A柱子上的n-1个盘子借助C移到B
		直接将A柱子上的盘子从A移到C
		最后将B柱子上的n-1个盘子借助A移到C	
*/
	if(1 == n) {
		printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A, C);
	} else {
		hannuota(n-1, A, C, B);											//现在有n个盘子在A,将n-1个盘子借助C移动B
		printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A, C);	//直接将A柱子上的盘子从A移到C
		hannuota(n-1, B, A, C);											//现在有n-1个盘子在B,将n-1个盘子借助A移动到C
	}

}

结果显示:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

free(me)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值