6.0、C语言——递归函数

函数递归

什么是递归?

        程序调用自身的编程技巧称为递归(recursion),递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或简介调用自身的一种方法,他通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量的程序就可描述出解题过程所需要多次重复的计算,大大减少了程序的代码量。递归的主要思考方式在于:把大事化小

递归的两个必要条件

存在限制条件,当满足这个限制条件的时候,递归便不再继续
        每次递归调用之后越来越接近这个限制条件

什么是栈溢出:

首先来看一下 每块内存区域存放的数据类型

写一个最简单的递归调用:

#include <stdid.h>
int main() {printf("递归调用main()函数");main();return 0;
}

调用函数的时候会向栈区申请分配一块空间,那么像上面这个代码,每次调用函数都会申请一块空间,然后他又在不断的自己调用自己,最后导致栈空间被占满造成 栈溢出 的情况发生 stack overflow

给大家介绍一个程序猿的知乎网站 stackoverflow:

Stack Overflow - Where Developers Learn, Share, & Build Careers

练习1:利用递归函数将一个十进制数的每一位依次打印出来,例如1234 ,打印1 2 3 4

#include <stdio.h>void print(int num) {if(num < 9) {print(num/10);}printf(num % 10);
}int main() {print(1234);return 0;
}

练习2:在不创建临时变量的情况下,写一个可以计算字符串长度的函数

#include <stdio.h>int my_strlen(char* arr) {if(*arr != '\0'){return 1 + my_strlen(arr + 1);}else {return 0;}
}int main() {char arr[] = "abcdefg";int len = my_strlen(arr);printf("my_strlen = %d", len);return 0;
}

练习3:利用递归计算一个数的阶乘

#include <stdio.h>int fac(int num) {if(num > 1) {return num*fac(num - 1);}else {return 1;}
}int main () {int result = fac(9);printf("result = %d", result);return 0;
}

练习4:利用递归算出给定位置的斐波那契数【斐波那契数就是前两个数相加等于后一个数,1,1,2,3,5,8,13,21......】

int fib(int num) {if(num <= 2) {return 1;}else {return fib(num-1)+fib(num-2)    }
}int main() {int num = 0;scanf("%d", &num);int result = fib(num);printf("%d", result);
}

这个函数执行的时候我们可以发现,当我们输入的数字较小的时候也就是所求的斐波那契数位置靠前的时候结果很快就计算出来了,但是当我们输入50的时候发现结果却迟迟没有计算出来~这是为什么呢?

      我们在上述代码中加入以下代码来测试一下,看看第4个斐波那契数会计算多少次?

int count = 0;int fib(int num) {if(num == 3) {count++;}if(num <= 2) {return 1;}else {return fib(num-1)+fib(num-2)    }
}int main() {int num = 0;scanf("%d", &num);int result = fib(num);printf("result = %d", result);printf("count = %d",count);
}

那么计算出来count的结果是三千多万次,很恐怖这个次数。所以当我们遇到计算菲波那切数的时候就不太适合用递归去计算了

        那这时就应该用循环迭代的方式去完成这个函数:

#include <stdio.h>
int fib(int num) {int a = 1;int b = 1;int c = 1;int count = 0;while(count < num - 2) {c = a + b;a = b;b = c;count++;}return c;
}int main() {int n = 2;int result = fib(n);printf("result = %d",result);return 0;
}

计算结果的速度明显比较递归来说,快了不要太多~

6.0、C语言——递归函数相关推荐

  1. C语言递归函数实现十位数转换进制并打印出来(超详细)

    C语言递归函数实现十位数转换进制并打印出来 思路 事例 代码 思路   取余倒排序   将数字每次除以进制数的余数打印,但这样不是倒排序,通过将打印操作写在调用递归函数下面,可以在每次调用递归函数时将 ...

  2. C语言递归调用return语句,理解C语言递归函数的逐级返回(return)

    递归函数,也即调用自身的函数. C Primer Plus中有个例子很棒: /*理解C语言递归函数*/ #include void up_and_down(int); int  main(void) ...

  3. C语言 递归函数实现二分查找

    C语言 递归函数实现二分查找 二分查找 #include<stdio.h> int binary(int arr[], int min, int max, int key) //min, ...

  4. c语言递归函数编程,c语言递归函数的使用方法

    c语言递归函数的使用方法 发布时间:2020-06-11 09:39:53 来源:亿速云 阅读:157 作者:Leah 这篇文章给大家分享的是c语言递归函数的使用方法.小编觉得挺实用的,因此分享给大家 ...

  5. LINQ体验(2)——C# 3.0新语言特性和改进(上篇)

    整体来说.Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心本身将不再变化(假设不了解.NET2.0的朋友,请參看MSDN或者一些经典的书籍 ...

  6. C# 3.0新语言特性和改进

    体来说,Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心本身将不再变化(如果不了解.NET2.0的朋友,请参看MSDN或者一些经典的书籍) ...

  7. C# 3.0新语言特性和改进(一)

    引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...

  8. 用c语言做RFID读卡程序,2.STM32读卡号读写数据代码示例3.0(C语言)

    文件名大小更新时间 2.STM32读卡号读写数据代码示例3.0(C语言)\HFRFID.uvgui.WEIZAI736912016-07-15 2.STM32读卡号读写数据代码示例3.0(C语言)\H ...

  9. C语言递归函数——汉诺塔问题笔记

    C语言递归函数--汉诺塔问题笔记 学C的时候老师根本没讲过递归,当时自己也没把它当回事,但是递归在算法中的地位实在太重要了.于是翻了翻C课本上的递归,书上讲的不多,但是一个经典的汉诺塔问题就让我伤透了 ...

最新文章

  1. mysql和windows连接不上_问题-jdbc连接不上mysql,windows下开启两个mysql服务
  2. 老牌医药收割AI红利:先投个15亿美元抢中国人才
  3. 【】python时间处理;PYTHON定时任务合集
  4. CMSIS对异常和中断标识符、中断处理函数名以及中断向量异常号都有严格的要求。
  5. Ubuntu修改DNS服务器
  6. boost::type_erasure::less_than_comparable相关的测试程序
  7. elasticsearch dump 教程
  8. MongoDB学习笔记~管道中的分组实现group+distinct
  9. java中搭建流水线,部署流水线搭建小记:Docker、Jenkins、Java 和 Couchbase
  10. 计算机word一体化教案,【计算机应用基础】word教案.doc
  11. 音乐人高嘉丰在 Opensea 发布音乐 NFT
  12. 【Verilog HDL】2. 4选1数据选择器
  13. 做人做事要有上进心2
  14. python输出完全平方数_LeetCode 279*. 完全平方数(Python)
  15. 随机梯度下降与梯度下降的区别?
  16. STM32实现PT100测温系统设计报告(OLED屏显示)
  17. SPFA算法(最短路径)
  18. 介绍18650锂离子电池的命名规则
  19. Java/JavaScript有哪些图形图像处理的框架?
  20. PyTorch模型训练的几个加速技巧

热门文章

  1. ClickHouse类型转换函数
  2. matlab中怎么求矩阵的维度,matlab矩阵维度不一致怎么办
  3. 科大讯飞发布四川话语音识别技术,号称识别准确率超过85%
  4. oracle的check约束
  5. Docker 自动更新镜像和容器-Watchtower
  6. iOS10 升级兼容必备参考
  7. PostgreSQL修改数据库名
  8. 如何看待好多人盼着锤子科技倒闭?
  9. window.print()打印时,如何自定义页眉/页脚、页边距
  10. 2020华为软件精英挑战赛——总结