c语言 函数的调用

一.什么是函数递归

   函数递归是c语言中一种重要的解决方法,递归递归,递指的是递推,归就是回归。他的意思就是函数自己调用自己,也就是我们常说的套娃。

c语言 函数的调用_第1张图片

 最简单的函数递归,但这串代码会出现栈溢出(Stack flow),也就是超出内存空间啦。

c语言 函数的调用_第2张图片

于是我们可以得到一个初步的想法:递归就是把一个大问题分解成若干个小问题,也就是“大事化小”的思想。接下我们结合递归限制条件来加深理解

二.递归的限制条件

1.要有限制

     如果没有限制条件,可能就会出现上述的死递归。当满足这个条件后,递归就停止了。

2.每次递归调用之后越来越接近这个限制条件。

不可能说每次递归调用之后离这个限制条件越来越远,不然会死递归。

三.示例

1.求n的阶乘

计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。

分析:由数学知识得,1!= 1   2!= 2x1!  3!=3x2! ....因此我们可以得到递推关系式

c语言 函数的调用_第3张图片

当n>1时,实现n!=n*(n-1)!   当n<=1时,n!=1

具体代码细节:

c语言 函数的调用_第4张图片

这里我们可以提供了一个思路:你可以先分析具体问题,列出递推关系,如果实在没有思路,可以尝试先列出一个if语句,毕竟递归需要限制条件。

过程分析:

c语言 函数的调用_第5张图片

2.斐波那契数列

形式:1 1 2 3 5 8... 第n(n>=3)项是前两项之和,n<=2时都是1

递推 n<=2时,   Fib(n)=1

         n>=3时,   Fib(n)=Fib(n-1)+Fib(n-1)

代码实现:c语言 函数的调用_第6张图片

但是这样存在问题

c语言 函数的调用_第7张图片

n=50时死活算不出来,原因是什么呢?比如当算第32项时你要算31项和30项,31项又要算30和29项,以此类推造成大量计算次数。

c语言 函数的调用_第8张图片

这时可以使用另一种解决问题的方法迭代。

四.迭代

迭代也就做循环。

c语言 函数的调用_第9张图片

此时效率大大提高。

因此我们要根据实际情况选择不同的解决方法。

今天的分享就到此结束了,感谢大家!

你可能感兴趣的:(c语言,开发语言)