(6)递归

目录

递归知识点:

递归操作:

阶乘的循环实现:

阶乘的递归实现:

经典的汉诺塔问题:


这篇笔记是根据郝斌老师的上课讲义整理而得。

递归知识点:

定义:一个函数自己直接或间接调用自己 。

举例:
    1. 求阶乘
    2. 求和
    3. 汉诺塔

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

循环和递归
    递归:
        易于理解,速度慢,存储空间大,
    循环:
        不易理解,速度快,存储空间小
汉诺塔复杂度:2的n次方减1.
走迷宫
递归的应用:
    树和森林就是以递归的方式定义的
    数和图的很多算法就是都是以递归实现的
    很多数学公式就是以递归的方式定义的。

递归操作:

阶乘的循环实现:

int main(){
    int val;
	int i, mult=1;
 
	printf("请输入一个数字: ");
	printf("val = ");
	scanf("%d", &val);
 
	for (i=1; i<=val; ++i)
		mult = mult * i;
	
	printf("%d的阶乘是:%d\n", val, mult);

}
    

阶乘的递归实现:

//假定n的值是1或大于1的值
long f(long n)
{
	if (1 == n)
		return 1;
	else
		return f(n-1) * n;
 
 
}

经典的汉诺塔问题:

当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。

            当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。

            当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。

           当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。

          综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样(只是事件的复杂程度不一样)。
 

#include <stdio.h>


2017-12-10汉诺塔实现
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);
    }
}

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

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

    hannuota(val, ch1, ch2, ch3);

    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值