六.学习数据结构之递归

1.概述

递归【这对你的编码能力是个质的飞跃,计算机特别适合用递归的思想来解决问题,但是我们人类用递归的思想来考虑问题就会感到十分困扰,这也是很多学过递归的人一直都搞不明白的地方!那是不是递归可以随便写,当然不是。递归的思想是软件思想的基本思想之一,在树和图论上面,几乎全是用递归来实现的,最简单,像求阶乘这种没有明确执行次数的问题,都是用递归来解决】

2.定义

一个函数自己直接或间接调用自己(一个函数调用另外一个函数和他调用自己是一模一样的,都是那三步,只不过在人看来有点诡异。)
一般函数调用工程

3.使用条件

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

4.循环和递归

理论上循环能解决的,肯定可以转化为递归,但是这个过程是复杂的数学转化过程,递归能解决不一定能转化为循环。
递归:

  • 易于理解

  • 速度慢

  • 存储空间大

循环:

  • 不易于理解

  • 速度快

  • 存储空间小

5.例子

主函数

#include<stdio.h>
#include<stdlib.h>

int fun(int);
int fun1(int);
void hannuota(int n, char A, char B, char C);
int main(void)
{
    //------递归例子1-------
    //printf("阶乘的结果:%d\n", fun(4));
    //------递归例子2-------
    //printf("求和的结果:%d\n", fun1(100));
    //------递归例子汉诺塔------
    char ch1 = 'A';
    char ch2 = 'B';
    char ch3 = 'C';
    int n;
    printf("请输入汉诺塔移动的盘子数量\n");
    scanf_s("%d", &n);
    hannuota(n, ch1, ch2, ch3);
    system("pause");
    return 0;
}

1.求阶乘


int fun(int num)
{
    int result = 0;
    if (num == 1)
    {
        result=1;
        return result;
    }
    else
    {
        result=fun(num - 1)*num;
        return result;
    }
}

------

2.(1+2+3+4+。。。+100)的和

int fun1(int num)
{
    if (num == 1)
        return 1;
    else
        return fun1(num - 1)+num;
}

3.汉诺塔
【汉诺塔】这不是线性递归,这是非线性递归!
n=1 1
n=2 3
n=3 7
………
………
n=64 2的64次方减1【这是个天文数字,就算世界上最快的计算机也解决不了,汉诺塔的负责度是2的n次方减1】问题很复杂,但真正解决问题的编码只有三句。

void hannuota(int n, char A, char B, char C)//函数的意思是把n个盘子从A借助B移动到C上
{
    if (n == 1)
        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);
    }
}

附图说明:
汉诺塔

4.走迷宫(CS的实现)

6.递归的运用

  • 树和森林就是以递归的方式定义的
  • 树和图的很多算法都是以递归来实现的
  • 很多数学公式就是以递归的方式定义的
  • 斐波拉契序列 1 2 3 5 8 13 21 34。。。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值