C语言—简单认知函数递归
C语言—简单认知函数递归1. 什么是递归在C语⾔中递归就是函数⾃⼰调⽤⾃⼰。#includestdio.hintmain(){printf(hehe\n);main();//main函数中⼜调⽤了main函数return0;}上述就是⼀个简单的递归程序只不过上⾯的递归只是为了演⽰递归的基本形式不是为了解决问题代码最终也会陷⼊死递归导致栈溢出。1.1 递归的思想把⼀个⼤型复杂问题层层转化为⼀个与原问题相似但规模较⼩的⼦问题来求解直到⼦问题不能再被拆分递归就结束了。所以递归的思考⽅式就是把⼤事化⼩的过程。1.2 递归的限制条件递归在书写的时候有2个必要条件递归存在限制条件当满⾜这个限制条件的时候递归便不再继续。每次递归调⽤之后越来越接近这个限制条件。2. 递归的限制条件2.1 举例1求n的阶乘⼀个正整数的阶乘是所有⼩于及等于该数的正整数的积并且0的阶乘为1。⾃然数n的阶乘写作n!。分析和代码实现我们知道n的阶乘的公式 n n ∗ (n − 1)!举例 5! 5*4*3*2*1 4! 4*3*2*1 所以:5! 5*4!这样的思路就是把⼀个较⼤的问题转换为⼀个与原问题相似但规模较⼩的问题来求解的。我们可以写出函数Fact求n的阶乘假设Fact(n)就是求n的阶乘那么Fact(n-1)就是求n-1的阶乘函数如下#includestdio.hintFact(intn){if(n0)return1;elsereturnn*Fact(n-1);}intmain(){intn0;scanf(%d,n);intretFact(n);printf(%d\n,ret);return0;}2.2 举例2顺序打印⼀个整数的每⼀位输⼊⼀个整数m按照顺序打印整数的每⼀位。输⼊1234 输出1 2 3 4 输⼊520 输出5 2 0分析和代码实现如果n是⼀位数n的每⼀位就是n⾃⼰。n是超过1位数的话就得拆分每⼀位。1234%10就能得到4然后1234/10得到123这就相当于去掉了4 然后继续对123%10就得到了3再除10去掉3以此类推 不断的 %10 和 /10 操作直到依次得到 4 3 2 1我们发现⼀个数字的最低位是最容易得到的通过%10就能得到那我们假设想写⼀个函数Print来打印n的每⼀位如下表⽰Print(n) 如果n是1234那表⽰为 Print(1234) //打印1234的每⼀位 其中1234中的4可以通过%10得到那么 Print(1234)就可以拆分为两步 1. Print(1234/10) //打印123的每⼀位 2. printf(1234%10) //打印4 完成上述2步那就完成了1234每⼀位的打印 那么Print(123)⼜可以拆分为Print(123/10) printf(123%10)直到被打印的数字变成⼀位数的时候就不需要再拆分递归结束。那么代码完成也就⽐较清楚voidPrint(intn){if(n9){Print(n/10);}printf(%d ,n%10);}intmain(){intm0;scanf(%d,m);Print(m);return0;}3. 递归的举例递归是⼀种很好的编程技巧但是和很多技巧⼀样也是可能被误⽤的就像举例1⼀样看到推导的公式很容易就被写成递归的形式intFact(intn){if(n0)return1;elsereturnn*Fact(n-1);}Fact函数是可以产⽣正确的结果但是在递归函数调⽤的过程中涉及⼀些运⾏时的开销。所以如果不想使⽤递归就得想其他的办法通常就是迭代的⽅式通常就是循环的⽅式。⽐如计算 n 的阶乘也是可以产⽣1~n的数字累计乘在⼀起的。intFact(intn){inti0;intret1;for(i1;in;i){ret*i;}returnret;}上述代码是能够完成任务并且效率是⽐递归的⽅式更好的。事实上我们看到的许多问题是以递归的形式进⾏解释的这只是因为它⽐⾮递归的形式更加清晰但是这些问题的迭代实现往往⽐递归实现效率更⾼。当⼀个问题⾮常复杂难以使⽤迭代的⽅式实现时此时递归实现的简洁性便可以补偿它所带来的运⾏时开销。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2581457.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!