当前位置: 首页 > news >正文

C语言学习笔记--递归函数

1. 递归函数的思想

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

(2)递归需要有边界条件

    ①当边界条件不满足时,递归继续进行

    ②当边界条件满足时,递归停止

2. 递归函数

(1)递归函数的函数体内部存在自我调用

(3)递归函数是递归的数学思想在程序设计中的应用。必须有递归出口,无限递归将导致程序栈溢出而崩溃。

3. 递归函数设计技巧

(1)递归模型的一般表示法

4. 递归函数设计实例

(1)用递归的方法编写函数求字符串长度

#include <stdio.h>

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

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

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

int main()
{
    printf("%d\n",fac(1));
    printf("%d\n",fac(2));
    printf("%d\n",fac(5));

    return 0;
}

(3)汉诺塔问题

    ①需求描述

I、将木块借助 B 柱由 A 柱移动到 C 柱

II、每次只能移动一个木块

III、只能出现小木块在大木块之上

    ②问题分解

I、将 n-1 个木块借助 C 柱由 A 柱移动到 B 柱

II、将最底层的唯一木块直接移动到 C 柱

III、将 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;
}

递归是一种将问题分而自治的思想,用递归解决问题首先要建立递归的模型。

 

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

转载于:https://www.cnblogs.com/CoderTian/p/5915071.html

相关文章:

  • UML-用例
  • 【Apache大系】Apache服务器面面观
  • MongoDB:实体对象(javabean)转DBObject
  • 关于TCP/IP协议
  • 【Python开发】Python PIL ImageDraw 和ImageFont模块学习
  • CSS学习(一)
  • 问题
  • jquery登录的异步验证
  • for循环的嵌套
  • 关于cmd下使用taskkill无法终止进程名包含空格的进程的解决方案
  • Hibernate —— Entity.hbm.xml
  • 【SQLServer2008】之Win10 安装 SQL Server 2008
  • Atitit.eclise的ide特性-------abt 编译
  • react.js 生命周期componentDidUpdate的另类用法:防止页面过渡刷新
  • JS内置对象
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 4个实用的微服务测试策略
  • Android 架构优化~MVP 架构改造
  • CentOS 7 防火墙操作
  • Hibernate最全面试题
  • JavaScript的使用你知道几种?(上)
  • Linux下的乱码问题
  • PHP 小技巧
  • Python学习之路16-使用API
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Webpack 4x 之路 ( 四 )
  • Yii源码解读-服务定位器(Service Locator)
  • 大型网站性能监测、分析与优化常见问题QA
  • 好的网址,关于.net 4.0 ,vs 2010
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 区块链将重新定义世界
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 1.Ext JS 建立web开发工程
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • # 安徽锐锋科技IDMS系统简介
  • #define用法
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)大道至简,职场上做人做事做管理
  • (转载)Linux网络编程入门
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • .ui文件相关
  • /*在DataTable中更新、删除数据*/
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @Resource和@Autowired的区别
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [BZOJ3757] 苹果树