码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构入门——递归

时间:2015-08-05 10:30:49      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:数据结构   算法   编程   入门   

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

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


递归示例:

# 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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构入门——递归

标签:数据结构   算法   编程   入门   

原文地址:http://blog.csdn.net/lfhappypain/article/details/47292351

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!