(函数p2) C语言从入门到入土(入门篇)(三)

简介: 5. 函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问 6. 函数的声明和定义 6.1 函数声明: 6.2 函数定义: 7. 函数递归 7.1 什么是递归? 7.2 递归的两个必要条件 7.2.1 练习1: 7.2.2 练习2: 7.3 递归与迭代 7.3.1 练习3: 7.3.2 练习4:

7.3 递归与迭代


7.3.1 练习3:


求 n 的阶乘。(不考虑溢出)

10.png

7.3.2 练习4:


求第 n 个斐波那契数。(不考虑溢出)

11.png12.png


//在我们自己能写出函数的时候,递归是很简单的,只是说有时候不能写出函数就会难想一点,但也都是个熟能生巧的过程哈!


但是我们发现 有问题 ;

在使用 fib 这个函数的时候如果我们要计算第 50 个斐波那契数字的时候特别耗费时间。

使用 factorial 函数求 10000 的阶乘(不考虑结果的正确性),程序会崩溃。

为什么呢?


13.png14.png


最后我们输出看看 count ,是一个很大很大的值。

那我们如何改进呢?

在调试 factorial 函数的时候,如果你的参数比较大,那就会报错: stack overflow (栈溢出)

这样的信息。

系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一

直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。

那如何解决上述的问题:

1. 将递归改写成非递归。

2. 使用 static 对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 static 对象替代

nonstatic 局部对象(即栈对象),这不

仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保

存递归调用的中间状态,并且可为 各个调用层所访问。

比如,下面代码就采用了,非递归的方式来实现:

// 求 n 的阶乘
int factorial ( int n )
{
        int result = 1 ;
        while ( n > 1 )
      {
            result *= n ;
            n -= 1 ;
      }
        return result ;
}
// 求第 n 个斐波那契数

15.png16.png17.png


提示:

1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。

2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。

3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开 销。

最后的最后,函数部分的内容就完成了哈!(当然后面进阶c语言的时候又会再细讲),今天的内容是有点难的,可能更多的是要去理解,嵌套调用,链式访问,递归,迭代好好理解,知道他每一步干什么,他的走向,其实就不会感觉那么难了哈!希望大家慢慢去思考。

要是觉得这篇文章对你有用的话,就来一个点赞加关注吧!!!

感谢观看!!!

最后祝我们一起变好!!!

相关文章
|
7天前
|
存储 C语言
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
16 1
|
4天前
|
存储 API C语言
C语言函数大全--e开头的函数
【6月更文挑战第6天】本篇介绍 C语言中 e开头的函数【C语言函数大全】
26 16
C语言函数大全--e开头的函数
|
6天前
|
存储 Linux Serverless
C语言函数大全--d开头的函数
【6月更文挑战第5天】本篇介绍 C语言中 d开头的函数【C语言函数大全】
15 1
C语言函数大全--d开头的函数
|
7天前
|
API C语言 开发者
C语言中抽象函数与具体实现的命名与组织
在C语言的嵌入式系统和开源软件开发中,良好地处理抽象函数与实现对于代码质量至关重要。建议将API作为接口定义操作,使用函数指针实现动态替换。避免使用`Impl`后缀,推荐用`Callback`或`Handler`表示具体实现。回调函数用于异步事件处理,通过指针传递。示例展示了C语言中函数指针的用法,嵌入式项目常通过目录结构区分平台相关代码。清晰的命名和组织能提升代码可读性和团队协作效率。
|
7天前
|
C语言
C语言进阶——文件的读写(文件使用方式、文件的顺序读写、常用函数、fprintf、fscanf)
C语言进阶——文件的读写(文件使用方式、文件的顺序读写、常用函数、fprintf、fscanf)
6 0
|
7天前
|
C语言 C++
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
15 3
|
7天前
|
C语言
C语言学习记录——鹏哥字符分类函数、字符转换函数
C语言学习记录——鹏哥字符分类函数、字符转换函数
10 2
|
7天前
|
安全 编译器 C语言
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
12 1
|
7天前
|
C语言
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
9 1
|
7天前
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
12 1