郝斌数据结构--递归专题

专题 递归

定义 把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。

 

递归的思想 将大规模(n)的问题转换成小规模(n-1)的问题解决

 

递归满足三个条件

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

循环和递归得关系

        递归的特点:

                    (1)易于理解

                    (2)速度慢

                    (3)存储空间大

        循环的特点:

                    (1)不易理解

                    (2)速度快

                    (3)存储空间小

举例

  1. 求阶乘
  2. 1+2+3+ ... 100得和
  3. 汉诺塔
  4. 走迷宫

 

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 

1. 每次只能移动一个圆盘; 

2. 大盘不能叠在小盘上面。

伪算法

if (n>1)

{

先把A柱子上得前n-1个盘子从A借助C移到B

将A柱子上得第n个盘子直接移到C

再将B柱子上得n-1个盘子借助A移到C

}

 

# include <stdio.h>

long factorial(long n);
long sum(int n);
void hanio(int n, char A, char B, char C);
long Fibonacci(int n);

int main(void)
{
	printf("阶乘的值%ld\n", factorial(5));
	printf("求和的值%ld\n", sum(100));
	hanio(3, 'A', 'B', 'C');
	printf("斐波那契的值%ld\n", Fibonacci(5));
	return 0;
}
// 假定n的值是1或大于1de值
long factorial(long n)
{
	if (1 == n)
		return 1;
	else
		return factorial(n - 1)*n;
}
long sum(int n)
{
	if (1 == n)
		return 1;
	else
		return sum(n - 1) + n;
}

void hanio(int n, char A, char B, char C)
{
	/*
	如果是1个盘子
		直接将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
	{
		hanio(n-1, A, C, B);
		printf("将第%d个圆盘从%c柱上移到%c柱上\n", n, A, C);
		hanio(n - 1, B, A, C);

	}
}
long Fibonacci(int n)
{
	if (n<=1)
		return 1;
	else
		return Fibonacci(n - 1) + Fibonacci(n - 2);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值