数据结构_P17

递归篇

# include <stdio.h>
/**
*	不同函数之间的相互调用
*	2016年6月18日21:11:00
*/

void f();
void g();
void k();	//必须要写声明,main调用f g k不是必须的,但是f g k之间相互调用时需要声明!

void f()
{
	printf("FFFFFF\n");
	g();
	printf("111111\n");
}

void g()
{
	printf("GGGGGG\n");
	k();
	printf("222222\n");
}

void k()
{
	printf("KKKKKK\n");
}

int main(void)
{
	f();		//输出FGK21

	return 0;
}

p17_2:

# include <stdio.h>
/**
*	函数自己调用自己,递归
*	2016年6月18日21:22:55
*/

void f(int n)
{
	if(n == 1)
		printf("哈哈\n");
	else
	{
		printf("gg\n");
		f(n-1);			//自己调用自己,递归
	}
}

int main(void)
{
	f(6);	//输出:gggggggg哈哈
	
	return 0;
}

p17_3:

# include <stdio.h>
/**
*	求阶乘的递归实现
*	2016年6月19日12:23:21
*/

int factorial(int);

int main(void)
{
	int n = 4;
	printf("%d\n", factorial(n));
	return 0;
}

int factorial(int n)
{
	if(1 == n)		//==号:常数和变量倒过来写!!
		return 1;
	else
		return (n*factorial(n-1));
}

p17_4:

# include <stdio.h>
/**
*	求阶乘的循环实现
*	2016年6月19日12:23:21
*/

int factorial(int);

int main(void)
{
	int n = 4;
	printf("%d\n", factorial(n));
	return 0;
}

int factorial(int n)
{
	int fac = 1;
	for(n; n>=1; n--)
	{
		fac = n*fac;
	}
	return fac;
}

p17_5:

# include <stdio.h>
/**
*	求1+2+3+...100的递归实现
*	2016年6月19日12:53:17
*/

int sum(int);

int main(void)
{
	int n = 100;
	printf("%d\n", sum(n));
	return 0;
}

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

p17_6:

# include <stdio.h>
/**
*	以上阶乘、求和例子都是函数直接调用自己;这里讲函数间接调用自己
*	2016年6月19日12:53:17
*/

void f(int);
void g(int);

void f(int n)
{
	g(n);
}

void g(int m)
{
	f(m);		//间接调用
}
int main(void)
{
	f(5);
	return 0;
}

P17_7:

# include <stdio.h>
/**
*	汉诺塔的实现:将A的n个盘子借助B移动到C
*	伪算法:
*	if(n>1)
*	{
*	1. 先把A的(n-1)个借助C移动到B;(与目标方式相同,只是改变了ABC位置,但是规模变小了!)
*	2. 将A的第n个盘子直接移动到C;
*	3. 再把B的(n-1)个盘子借助A移动到C(与1方式相同,只是改变了ABC位置)
*	}	s	
*	2016年6月19日14:41:17
*/

void hannuota(int, char, char, char);

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

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

	hannuota(n, ch1, 'B', 'C');	//汉诺塔:将A上的n盘子借助B移动到C(ps:ch1与'A'等价)


	return 0;
}
/**
void hannuota(int n, char A, char B, char C)
{
	如果是1个盘子
		直接将A上的从A移到C
	否则
		先将A柱子上的n-1个盘子借助C移动B;
		直接将A上的第n个盘子从A移动C;
		将B上的n-1个盘子借助A移动C
}
*/

void hannuota(int n, char A, char B, char C)	//A借助B移到C
{
	if(1 == n)
		printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A,C );
	else
	{
		hannuota(n-1, A, C, B);
		printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A,C );
		hannuota(n-1, B, A, C);
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值