当前位置: 首页 > wzjs >正文

济南网站设计公司富中山精品网站建设信息

济南网站设计公司富,中山精品网站建设信息,装修网站建设网,网页报价单页一般多少在学习了函数之后,函数递归是我们必然会接触到的课题,下面就让我们看下函数递归相关的知识. 递归是什么? 递归这个词看着就不那么好理解,那么什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数自己调用自己. 写⼀个史上最简单的C语⾔递归代码: …

        在学习了函数之后,函数递归是我们必然会接触到的课题,下面就让我们看下函数递归相关的知识.

递归是什么?

        递归这个词看着就不那么好理解,那么什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数自己调用自己.

        写⼀个史上最简单的C语⾔递归代码:

int main()
{printf("hehe\n");main();return 0;
}

        尽管这个代码可以跑起来,但是在跑一会后就会出现下面的现象.在报错栏可以看到如递归所有控件路径,函数将导致运行时堆栈溢出的字.所以这串代码只起到了演示作用毫无解决问题意义.

        当然通过今天的简单学习是还不足以掌握函数递归的.在之后的学习中,特别是数据结构中我们会常用到这方面的知识.那时在进一步熟悉使用.

        递归的思想: 把⼀个大型复杂问题层层转化为⼀个与原问题相似,但规模较小的子问题来求解;直到子问题不能再被拆分,递归就结束了.所以递归的思考⽅式就是把⼤事化⼩的过程。 递归中的递就是递推的意思,归就是回归的意思.

递归的限制条件

        为了避免像上面演示代码一样的无限递归导致栈溢出现象.递归在书写的时候,有2个必要条件:

        1.递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续.

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

递归举例

  举例1:求n的阶乘

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

        我们知道n的阶乘的公式: n! =  n ∗ (n − 1)!        

        这样的思路就是把⼀个较⼤的问题,转换为⼀个与原问题相似,但规模较⼩的问题来求解的。 n!---> n*(n-1)! (n-1)! ---> (n-1)*(n-2)!.......直到n是1或者0时,不再拆解.这样就可以得到递推函数式.

        然后我们就可以尝试写出代码了.

//计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘
int Fuc(int a)
{if (0 == a){return 1;}else{return Fuc(a - 1) * a;}
}
int main()
{int a = 0;scanf("%d", &a);printf("%d\n",Fuc(a));return 0;
}
//注:这⾥不考虑n太⼤的情况,n太⼤存在溢出

         我们可以从递推演示图中更好地了解这个函数的递推过程.

  举例2:顺序打印⼀个整数的每⼀位

输⼊⼀个整数m,打印这个按照顺序打印整数的每⼀位。

⽐如:

输⼊:1234 输出:1 2 3 4

输⼊:520 输出:5 2 0

        我们可以发现每个数的最后一位是最容易拿到的.进一步用递归的思想思考我们可以得:到打印1234的每一位可以转化为打印123每一位然后在打印4.我讲这个函数命名为Print,就可以得到下面的表达式.

        这样就可以写出代码了.

//输⼊⼀个整数m,打印这个按照顺序打印整数的每⼀位。
void Print(int a)
{if (a > 9){Print(a / 10);printf("%d ", a % 10);}else{printf("%d ", a);}
}
int main()
{int a = 0;scanf("%d", &a);Print(a);return 0;
}

        通过 上面两个例子,简单地说下我在递归中常犯的错误:如果递归函数有返回值那么需要写return后面写函数自己,如果返回值为void,那么直接调用函数即可,不要写return.

递归与迭代

        递归是⼀种很好的编程技巧,但是很多技巧⼀样,也是可能被误⽤的,就像举例1⼀样,看到推导的公式,很容易就被写成递归的形式.Fact函数是可以产⽣正确的结果,但是在递归函数调⽤的过程中涉及⼀些运⾏时的开销.也就是在上面代码中备注的,如果输入过大就会造成递归太深而栈溢出.(这里涉及到函数栈帧的问题,关于函数栈帧的详细内容见博客C语言复习笔记--函数栈帧创建与销毁-CSDN博客).

        所以如果不想使⽤递归就得想其他的办法,通常就是迭代的⽅式(通常就是循环的⽅式).下面就用迭代的方式来解决下举例1.

int main()
{int a = 0;int n = 1;scanf("%d", &a);for (int i = 1; i <= a; i++){n *= i;}printf("%d ", n);return 0;
}

        事实上,我们看到的许多问题是以递归的形式进⾏解释的,这只是因为它⽐⾮递归的形式更加清晰, 但是这些问题的迭代实现往往⽐递归实现效率更⾼.下面再来看一个例子

  举例3:求第n个斐波那契数

就像计算第n个斐波那契数

        看到这公式,很容易诱导我们将代码写成递归的形式,如下所⽰:

int Fib(int a)
{if (1 == a || 2 == a){return 1;}else{return Fib(a - 1) + Fib(a - 2);}
}
int main()
{int a = 0;scanf("%d", &a);int n = Fib(a);printf("%d ", n);return 0;
}

        但是当输入的a变大之后这个程序跑出结果变得非常慢.因为递归需要重复计算好多数值.如图下所示,(同种颜色都是重复计算)所以这个问题更适合用迭代去解决.

//迭代
int Fib(int a)
{int x = 1;int y = 1;int z = 0;for (int i = 3; i <= a; i++){z = x + y;x = y;y = z;}return z;
}
int main()
{int a = 0;scanf("%d", &a);int n = Fib(a);printf("%d ", n);return 0;return 0;
}

        迭代的⽅式去实现这个代码,效率就要⾼出很多了.递归虽好,但是也会引⼊⼀些问题,我们要适当使用. 


文章转载自:

http://ditDNYJD.rcwzf.cn
http://vJrIuIAw.rcwzf.cn
http://Fc3MeTGM.rcwzf.cn
http://dliRLq4V.rcwzf.cn
http://TMciVyqc.rcwzf.cn
http://ZIjliLfZ.rcwzf.cn
http://gZGW3kFo.rcwzf.cn
http://tpOqhOJI.rcwzf.cn
http://IH2kd1Hz.rcwzf.cn
http://Npy7OrZR.rcwzf.cn
http://Roienuf1.rcwzf.cn
http://Q8kfU1Va.rcwzf.cn
http://b5LSQSYc.rcwzf.cn
http://wwjlr7aZ.rcwzf.cn
http://J0Lmg2l7.rcwzf.cn
http://0wsZrnEd.rcwzf.cn
http://RKpNkHB4.rcwzf.cn
http://vyMmRPhg.rcwzf.cn
http://ELGR0IWs.rcwzf.cn
http://yOYsIa3B.rcwzf.cn
http://Mxga5q4n.rcwzf.cn
http://0q6nDrFn.rcwzf.cn
http://vf3x7bgH.rcwzf.cn
http://OICSUZpf.rcwzf.cn
http://uYrfiHVY.rcwzf.cn
http://EedibaIW.rcwzf.cn
http://yR4JsflG.rcwzf.cn
http://wPvhtXhT.rcwzf.cn
http://sMdJg6Jj.rcwzf.cn
http://TwTF4jXb.rcwzf.cn
http://www.dtcms.com/wzjs/719619.html

相关文章:

  • 新乡手机网站建设中国做外贸的网站
  • 搭建wordpress站点商城网站建设网络公司
  • 甘肃省建设监理协会 官方网站深圳企业营销型网站
  • c 网站开发连接mysql网站建设前期要多久
  • 做文章网站网站建设详情报价
  • 网站空间购买哪个好四川建设网是国企吗
  • 建设网站什么软件比较好js网页制作代码大全
  • 佛山网站建设wantsun做网站方法
  • 广东省建设部网站上海营销型网站代理
  • discuz可以做商城网站吗上海工商信息查询网
  • 浙江网站建设而o2o商城网站搭建
  • 怎么轻松搭建自己的网站公司做网站费用入什么科目
  • 比较好看的网站设计Wordpress公网
  • 国内优秀网站网站正在建设源代码
  • 权威的建筑工程网站室内设计网站资源
  • 企业网站建设需要多少钱成都外贸建站平台
  • 国外购物平台企业网站优化问题
  • 创新 反腐倡廉网站建设搜索引擎营销有哪些
  • 国内做网站的顶尖公司南京百家湖网站建设
  • 北京建设制作网站鞍山吧百度贴吧
  • 宁乡电商网站建设收费镭拓网站建设
  • python网站开发环境软件外包公司哪个好
  • 网站建设小程序网站忧化 优帮云
  • 英文医疗网站建设wordpress 同步 博客园
  • 经营者采用过哪几种网络营销方式广安网站seo
  • 网站一直不被百度收录wordpress 评论数量
  • 企业门户网站建设方案怎么写成功的网站不仅仅是优化排
  • 网站推广优化排名seo网站如何做微信支付宝
  • 西城顺德网站建设建网页还是网站
  • 石做视频网站需要牌照做网站如何赢利的