博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C】 47_递归函数分析
阅读量:5900 次
发布时间:2019-06-19

本文共 1525 字,大约阅读时间需要 5 分钟。

递归的数学思想

  • 递归是一种数学上分而自治的思想
  • 递归需要边界条件

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

递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理。

递归函数

  • 函数体内部可以调用自己
  • 递归函数

    • 函数体中存在自我调用的函数
  • 递归函数是递归的数学思想在程序设计中的应用

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

递归函数设计技巧

  • 递归模型的一般表示法

clipboard.png

递归函数设计示例 一

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

clipboard.png

递归版 strlen

#include 
int strlen_r(const char* s){ if( *s != '\0' ) { return 1 + strlen_r(s + 1); } else { return 0; }}int main(){ printf("%d\n", strlen_r("abc")); printf("%d\n", strlen_r("")); return 0;}
输出:printf("%d\n", strlen_r("abc"));printf("%d\n", strlen_r(""));

递归函数设计示例 二

  • 斐波拉契数列递归解法

1, 1, 2, 3, 5, 8, 13, 21, ...

clipboard.png

编程实验:斐波拉契数列

#include 
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;}
输出:1134

递归函数设计示例 三

  • 哈诺塔问题

    • 将木块借助 B 柱由 A 柱移动到 C 柱
    • 每次只能移动一个木块
    • 只能出现小木块在大木块之上

clipboard.png

  • 汉诺塔问题分解

    • 将 n-1 个木块借助 C 柱由 A 柱移动到 B 柱
    • 将最底层的唯一模块直接移动到 C 柱
    • 将 n-1 个木块借助 A 柱由 B 柱 移动到 C 柱

clipboard.png

编程实验: 汉诺塔问题求解

#include 
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;}
输出:A --> CA --> BC --> BA --> CB --> AB --> CA --> C

小结

  • 递归是一种将问题分而自治的思想
  • 用递归解决问题首先要建立递归的模型
  • 递归解法必须要有条件边界,否则无解

以上内容参考狄泰软件学院系列课程,请大家保护原创!

转载地址:http://knesx.baihongyu.com/

你可能感兴趣的文章
[算法]基于分区最近点算法的二维平面
查看>>
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>
笨办法学C 练习1:启用编译器
查看>>
树的总结--树的性质(树的深度) leetcode
查看>>
nagios短信报警(飞信fetion20080522004-linrh4)
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
linux 将大文件分成小文件
查看>>
CCNA- 距离矢量路由协议学习
查看>>
企业实践用户邮箱导入/导出(第2部分)
查看>>
如何学习Linux命令-初级篇
查看>>
从Oracle Public Yum为Oracle Linux建立本地的Yum源
查看>>
在 SELECT 查询中使用表表达式
查看>>
静态路由和默认路由
查看>>
关于阿里开发者招聘节 |这5道笔试真题 你会吗!???
查看>>
C#的异常处理机制
查看>>
vsftp:500 OOPS: could not bind listening IPv4 sock
查看>>
Linux安装BTCPayServer并设置比特币BTC和Lightning支付网关
查看>>
Python 的 with 语句
查看>>
mysql安装,远程连接,以及修改密码
查看>>
Mybatis查询返回Map类型数据
查看>>