ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

深度剖析 —— 递归

深度剖析 —— 递归 系列文章目录深度剖析数据深度剖析递归深度剖析结构体深度剖析动态内存管理深度剖析文件操作深度剖析预处理前言递归类似于循环但比循环更加灵活。递归思想: 将大事化小将复杂的问题用简单的代码去实现。一、递归是什么1.递归是一种算法思想2.递归是函数调用自身的过程3.像循环一样不断的重复某一件事二、递归与循环1.循环do while: 每次循环必定会先执行一次再进行判断voiddo_while(intn){do{printf(不好好学习没有工作\n);}while(--n);printf(好好学习找到好工作\n);}程序运行时一定会先执行不好好学习没有工作然后循环判断是否好好学习如果满足条件则循环停止。输出结果:不好好学习没有工作 不好好学习没有工作 不好好学习没有工作 好好学习找到好工作2.递归递归:每次循环必定会先执行一次再进行判断要点:1.要设置停止递归的条件(防止死递归)2.每次调用通常要改变传入的值3.先由外向内再由内向外进去几次出来几次4.递归过于深入可能出现栈溢出voidrecursion(intn){printf(不好好学习没有工作\n);if(n){recursion(n-1);}printf(好好学习找到好工作\n);}程序运行时必定先执行不好好学习没有工作如果符合条件再次进入函数再次执行。当不符合条件时执行下一步好好学习找到好工作在这里是由内向外打印。输出结果不好好学习没有工作//第一次调用不好好学习没有工作//第二次调用不好好学习没有工作//第三次调用不好好学习没有工作//第四次调用...好好学习找到好工作//第四次调用好好学习找到好工作//第三次调用好好学习找到好工作//第二次调用好好学习找到好工作//第一次调用同样是必定执行一次 而递归是通过不断调用自己来实现循环。三.练习练习1.接受一个整型值无符号按照顺序打印它的每一位。例如:输入:1234输出:1 2 3 4#includestdio.hvoidprint(intn){if(n9){print(n/10);}printf(%d ,n%10);}练习2.编写函数不允许创建临时变量求字符串的长度。intStrlen(constchar*str){if(*str\0){return0;}else{return1Strlen(str1);}}注解:Strlen(str 1) 为每次调用时改变条件。返回时 1表示此次调用找到1 返回值个字符串依此返回每次返回都 1练习3.n的阶乘intfactorial(intn){if(n1){return1;}else{returnn*factorial(n-1);}}练习4.递归实现逆序字符串数组的内容voidreverse_string(char*str){intlenstrlen(str);chartmp*str;*str*(strlen-1);*(strlen-1)\0;if(len3){reverse_string(str1);}*(strlen-1)tmp;}注解:tmp先记录首字符内容*(str len - 1) \0;将最后一个字符变为‘\0’ 方便下一次找到倒数第二个字符注解:最后再将tmp赋值给原先赋值\0的位置完成交换总结思想核心(大事化小)1.具有规律性重复性2.调用时参数的可变性3.返回值的叠加性4.由外向内再由内向外进去几次出来几次
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进