数据结构学习记录(五)------递归举例

前言

递归:一个函数直接或者间接调用自己。
本文主要介绍递归的几个简单举例。

递归满足的条件

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

循环与递归的比较

所有循环都可以由递归实现,而所有递归不一定都可由循环实现。

比较内容优点缺点
递归容易理解速度慢、存储空间大
循环速度快、存储空间小不易理解

求阶乘

用循环实现

#include <stdio.h>

int main(void)
{
    int i;
    int n;
    int mult = 1;
    printf("请输入要一个数:n = ");
    scanf("%d", &n);

    for(int i = 1; i <= n; ++i)
        mult = mult * i;

    printf("%d的阶乘为%d\n", n, mult);

    return 0;
}

用递归实现

#include <stdio.h>

int factorial_recursive(int n)
{
    if(1 == n)
        return 1;
    else
        return factorial_recursive(n - 1) * n;
}

int main(void)
{
    printf("%d\n", factorial_recursive(5));;

    return 0;
}

求1+2+3+…+100的和

用循环实现

#include <stdio.h>

int main(void)
{
    int i;
    int sum = 0;

    for(i = 0; i <= 100; ++i)
    {
        sum += i;
    }
    printf("%d\n", sum);

    return 0;
}

用递归实现

#include <stdio.h>

int sum_recursive(int n)
{
    if(1 == n)
        return 1;
    else
        return sum_recursive(n - 1) + n;
}

int main(void)
{
    printf("%d\n", sum_recursive(100)); 

    return 0;
}

汉诺塔

在这里插入图片描述

如何把A上面的n个盘子借助B移动到C上,要求:
1、一次只能移动一个盘子;
2、移动过程中,大盘子永远不能放在小盘子上面。

伪算法

if (1 == n)
    直接将A上的盘子移到C上
else
{
    先把A上面的前n-1个盘子从A借助C移动到B上;
    将A上面的第n个盘子直接从A移动到C;
    再将B上的n-1个盘子借助A移到C。
}

代码

#include <stdio.h>

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

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

    printf("请输入A柱子上面盘子的个数:n = ");
    scanf("%d", n);

    hannuota(n, A, B, C);//第一个参数表示盘子的个数,第二个参数表示放盘子的柱子,第三个参数表示借助的柱子,第四个柱子表示要移到的柱子

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

参考资料

[1]数据结构–郝斌link.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值