数据结构入门——递归

    数据结构是学习编程路上的重要一步,也为以后学习算法打下基础,数据结构又称算法与数据结构,与算法密不可分,是计算机软件专业的核心课程,其重要性不言而喻。

    递归分为递推与回归两个过程,递归的优点是容易理解,方便编程,可以解决很多问题,缺点是需要不断的调用递归,时间效率慢,空间占用大。


递归示例:

# include <stdio.h>

int f(int n)
{
	//printf("1");
	n = f(n);

	return n;
	//return f(n);  //递归,必须设置一个终止条件,即必须在一定条件下执行return语句,否则将无限递归。
}

//递归的数值必须是变动的,可增可减,但必须有一个上下限,达到上下限后递归终止返回,其递归的规模始终是递减的。
int g(int n)
{
	if (n > 9)
		printf("哈哈!\n");
	else
		n = g(n+1);  //值增大,规模在减小。

	return n;
}

int main(void)
{
	int m, n;

	m = f(5);
	printf("%d\n", m);

	n = g(5);
	printf("%d\n", n);

	return 0;
}

递归示例:

# include <stdio.h>

void f();
void g();
void k();

//函数间的互相调用及其返回顺序
int main(void)
{
	f();

	return 0;
}

void f()
{
	printf("FFFF\n");
	g();
	printf("1111\n");
}

void g()
{
	printf("GGGG\n");
	k();
	printf("2222\n");
}

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

递归必须设置结束条件,不能无限递归:

# include <stdio.h>

void f();

int main()
{
	f();

	return 0;
}

void f()
{
	printf("哈哈!\n");
	f();
}

//进行递归所用的栈满后,溢出,程序出错而停止。
//递归不能出现死递归,必须设置递归结束的条件。

递归的调用:

# include <stdio.h>

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

int main(void)
{


	return 0;
}

//f函数与g函数间接调用自己
void f(int n)
{
	g(n);
}

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

//k函数直接调用自己
void k(int val)
{
	k(val-1);
}

递归求和:

# include<stdio.h>

int f(int n)
{
	if (1 == n)
		return 1;
	else
		return f(n-1) + n;  //n与前一个结果的和
}

int main(void)
{
	int i, val;
	int sum;

	printf("请输入自然数求和上限:val = ");
	scanf("%d", &val);

	sum = f(val);

	printf("求和结果为:sum = %d\n", sum);

	return 0;
}

汉诺塔问题(很经典的程序,适合递归来解决):

# include <stdio.h>

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

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

	printf("请输入盘子的个数:");
	scanf("%d", &n);
	
	hannuota(n, ch1, ch2, ch3);

	return 0;
}

void hannuota(int n, char A, char B, char 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);
	}
}


阶乘(循环实现):

递归与循环在一定程序上可以互相实现的。

# include <stdio.h>

int main(void)
{
	int val;
	int i;
	int mult = 1;

	printf("请输入阶乘上限数字:val =");  //注意,当输入数字过大时,结果显示为0,因为栈溢出。
	scanf("%d", &val);

	//用循环实现阶乘
	for (i=1; i<=val; ++i)
	{
		mult = mult*i;
	}

	printf("%d的阶乘结果是:%d\n", val, mult);

	return 0;
}

阶乘(递归实现):

# include <stdio.h>

//用递归实现
long f(long n)
{
	if (1 == n)
		return 1;  //递归是一个规模不断缩小的计算,必须设置达到最小值时的返回值。
	else
		return f(n-1) * n;
}

//n的解决必须借助n-1的结果,不断递减,最后回归。
//递归分为递推与回归两个方面。
int main(void)
{
	int i, val;
	long mult;

	printf("请输入阶乘数字上限:val = ");
	scanf("%d", &val);

	mult = f(val);

	printf("%d的阶乘结果是:%ld\n", val, mult);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值