视觉差网站设计,北京大兴网站建设公司咨询,卖水果做哪个网站好,wordpress阅读量造假函数递归 一. 递归是什么1.1 递归的思想1.2 递归的限制条件 二. 递归举例2.1 求n的阶乘2.2 按顺序打印一个整数的每一位 三. 递归与迭代3.1 求第n个斐波那契数 一. 递归是什么
递归是学习C语言很重要的一个知识#xff0c;递归就是函数自己调用自己#xff0c;是一种解决问题… 函数递归 一. 递归是什么1.1 递归的思想1.2 递归的限制条件 二. 递归举例2.1 求n的阶乘2.2 按顺序打印一个整数的每一位 三. 递归与迭代3.1 求第n个斐波那契数 一. 递归是什么
递归是学习C语言很重要的一个知识递归就是函数自己调用自己是一种解决问题的方法下面就使用一个简单的代码帮助大家理解下面展示一些 内联代码片。 #include stdio.h
int main()
{
printf(hehe\n);
main() //出现了main函数自己调用自己
return 0上图展示的代码就是一个简单的调用函数的例子不断的调用main函数也就是要不断输出hehe形成了一个循环这就是一个简单的函数递归。
1.1 递归的思想
把一个大型问题转换成一个与原问题相似但是规模较小的子问题来解决直到到子问题不能再被拆分递归就结束了。递归中的递就是递推的意思归就是回归的意思下面会有详细的解释。
1.2 递归的限制条件
递归在书写的时候有两个必要条件 . 递归存在限制条件当满足这个限制条件的时候递归便不再继续 . 每次递归之后越来越接近这个限制条件
二. 递归举例
2.1 求n的阶乘
为了让大家更好理解递归是怎么回事我们可以举几个例子下面为大家展示第一个例子求n的阶乘的代码 内联代码片。 int Fact(int n)
{if (n 0)return 1;else if (n 0)return n * Fact(n - 1);//相当于是多次调用这个函数形成一个循环不断地累乘
}int main()
{int n 0;scanf(%d, n);int r Fact(n);printf(%d, r);return 0;
}上述代码就给大家演示了一遍比较基本的函数递归我们可以看到如果n大于0的话就会返回n*Fact(n-1)所以就相当于不断的调用Fact函数如果大家还是不太理解下面我们用一张图帮助大家进一步理解
2.2 按顺序打印一个整数的每一位
这是为大家展示的第二个例子按顺序打印一个整数的每一位。首先我们看到这个题目我们不难想到用%的方法假如现在给一个数字1234要如何打印出1 2 3 4 这四个数字呢首先就是很容易想到1234%104这时候我们就得到了4然后1234/10123(默认取整),然后再用123%103这时候我们就得到了3…按照这个思路我们的代码就能实现后面我还会再加上图片解释方便大家进一步理解 内联代码片。 void get(int n)
{if (n 9){get(n / 10);}printf(%d , n % 10);
}int main()
{int n 0;scanf(%d, n);get(n);return 0;
} 三. 递归与迭代
(1)递归是⼀种很好的编程技巧但是和很多技巧⼀样也是可能被误⽤的就像举例1⼀样看到推导的公式很容易就被写成递归的形式为大家解释一下我们的第一个例子求n的阶乘我们用递归的方法很容易算出来但是我们可以自己操作一下如果数值小的话计算结果是很快出来但是如果我们的数值偏大假如我们输入50那么计算结果就会很慢原因就是 Fact函数是可以产生正确的结果但是在递归函数调用的过程中涉及⼀些运行时的开销。
在C语言中每⼀次函数调用都需要为本次函数调用在内存的栈区申请⼀块内存空间来保存函数调用期间的各种局部变量的值这块空间被称为运行时堆栈或者函数栈帧。函数不返回函数对应的栈帧空间就⼀直占用所以如果函数调用中存在递归调用的话每⼀次递归函数调用都会开辟属于自己的栈帧空间直到函数递归不再继续开始回归才逐层释放栈帧空间。所以如果采用函数递归的方式完成代码递归层次太深就会浪费太多的栈帧空间也可能引起栈溢出stackoverflow的问题。
(2)所以如果不想使用递归就得想其他的办法通常就是迭代的方式通常就是循环的方式比如我们举的第一个例子计算n的阶乘也是可以产⽣1~n的数字累计乘在⼀起的。
上述代码是能够完成任务并且效率是比递归的方式更好的。事实上我们看到的许多问题是以递归的形式进行解释的这只是因为它比非递归的形式更加清晰但是这些问题的迭代实现往往比递归实现效率更高。但是当⼀个问题非常复杂难以使用迭代的方式实现时此时递归实现的简洁性便可以补偿它所带来的运行时开销。所以我们不能说是递归更便捷还是迭代更便捷我们更多的要去思考问题本身。
3.1 求第n个斐波那契数
我们也能举出更加极端的例⼦就像计算第n个斐波那契数是不适合使⽤递归求解的但是斐波那契数 (1 1 2 3 5 8 13…前两个数相加) 的问题通过是使⽤递归的形式描述的如下 当我们n输⼊为50的时候需要很长时间才能算出结果这个计算所花费的时间是我们很难接受的这也说明递归的写法是非常低效的那是为什么呢其实递归程序会不断的展开在展开的过程中我们很容易就能发现在递归的过程中会有重复计算而且递归层次越深冗余计算就会越多。 就像上面的图片上展示的计算一个数值就要将它拆分成另外两个数以此类推会循环很多很多次也造成了巨大的计算量所以在有些时候我们不妨试试另一种方法例如迭代的方法其实循环也算是迭代的一种下图计算将递归的方法转换成迭代的方式去实现这个代码效率就要高出很多了。有时候递归虽好但是也会引⼊⼀些问题所以我们⼀定不要迷恋递归适可而止就好。
以上就是关于递归的一些初级的理解在后期我也会为大家继续写更多关于递归的知识以及一些深入的了解。