递归

1 递归

1.1 递归的数学思想

递归是一种数学上分而自治的思想,递归将大型复杂问题转换为与原问题相同但规模较小的问题进行处理。

递归需要有边界条件:

  • 当边界条件不满足时,递归继续进行。
  • 当边界条件满足时,递归停止。

1.2 递归函数

我们首先知道,函数体内部可以调用自己。

递归函数:

  • 函数体中存在自我调用的函数。

递归函数是递归的数学思想在程序设计中的应用:

  • 递归函数必须有递归出口。
  • 函数的无限递归将导致程序栈溢出而崩溃。

1.3 递归函数设计技巧

递归模型的一般表示法:
在这里插入图片描述


2 递归函数设计示例

2.1 求字符串的长度

用递归的方法编写函数求字符串长度:
在这里插入图片描述

#include <stdio.h>

int strlen_r(const char* s)
{
    if( *s )
    {
        return 1 + strlen_r(s+1);
    }
    else
    {
        return 0;
    }
}

int main()
{
    printf("%d\n", strlen_r("abc"));
    printf("%d\n", strlen_r(""));
    
    return 0;
}

2.2 斐波那契数列

斐波那契数列递归解法:
在这里插入图片描述

#include <stdio.h>

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

int main()
{
    printf("%d\n", fac(1));
    printf("%d\n", fac(2));
    printf("%d\n", fac(9));
    
    return 0;
}

2.3 汉诺塔问题

汉诺塔问题:

  • 将木块借助B柱由A柱移动到C柱
  • 每次只能移动一个木块
  • 只能出现小木块在大木块之上
    在这里插入图片描述
    汉诺塔问题分解:
  • 将n-1个木块借助C柱由A柱移动到B柱
  • 将最底层的唯一木块直接移动到C柱
  • 将n-1个木块借助A柱由B柱移动到C柱
    在这里插入图片描述
#include <stdio.h>

void han_move(int n, char a, char b, char c)
{
    if( n == 1 )
    {
        printf("%c --> %c\n", a, c);
    }
    else
    {
        han_move(n-1, a, c, b);
        han_move(1, a, b, c);
        han_move(n-1, b, a, c);
    }
}

int main()
{
    han_move(3, 'A', 'B', 'C');
    
    return 0;
}


参考资料:

  1. C语言进阶剖析教程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值