(函数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语言的时候又会再细讲),今天的内容是有点难的,可能更多的是要去理解,嵌套调用,链式访问,递归,迭代好好理解,知道他每一步干什么,他的走向,其实就不会感觉那么难了哈!希望大家慢慢去思考。

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

感谢观看!!!

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

相关文章
|
2天前
|
C语言
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
17 0
|
2天前
|
C语言
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
4 0
|
2天前
|
C语言
C语言——函数递归
C语言——函数递归
4 0
|
2天前
|
C语言
C语言—函数(大化小方式的心脏)
C语言—函数(大化小方式的心脏)
2 0
|
2天前
|
C语言
C语言——入门分支与循环
C语言——入门分支与循环
3 0
|
3天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
15 2
|
3天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
3天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
3天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
3天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)