C语言之递归的应用

代码 代码 1261 人阅读 | 0 人回复

<
C言语之递回的使用



1、甚么是递回

递回简朴的来讲便是正在函数中挪用本人
它凡是把一个年夜型庞大的成绩层层转化为一个取本成绩类似的范围较小的成绩去供解,递回战略只需大批的程序便可描摹出解题历程所需求的屡次反复策画,年夜年夜天削减了程序的代码量。
递回的两个须要前提:
存正在限定前提,当满意那个限定前提的时分,递回便没有再担当。
每次递回挪用以后愈来愈接近那个限定前提。
2、递回模板

  1. void recursion(参数0)
  2. {
  3.     if (停止前提)
  4.     {
  5.         return;
  6.     }
  7.     else
  8.     {
  9.         recursion(参数1)
  10.     }
  11. }
复造代码
3、递回的实践使用

1.阶乘递回

  1. int tmp(int n)
  2. {
  3.         if (n == 1)
  4.         {
  5.                 return 1;
  6.         }
  7.         else
  8.         {
  9.                 return n*tmp(n - 1);
  10.         }
  11. }
复造代码
123639tpwp2sdslz6m8g30.jpg

2.斐波那契数列

斐波那契数列指的是那个数列从第3项开端,每项皆即是前两项之战。
递回算法:
  1. int fibonacci(int n)
  2. {
  3.         if (n<=2)
  4.                 return 1;
  5.         else
  6.         {
  7.                 return fibonacci(n - 1) + fibonacci(n - 2);
  8.         }
  9. }
复造代码
4、递回的典范成绩

汉诺塔成绩

汉诺塔成绩滥觞:
汉诺塔(又称河内乱塔)成绩是源于印度一个陈腐传道的益智玩具。年夜梵天缔造天下的时分做了三根金刚石柱子,正在一根柱子上从下往上根据巨细挨次摞着64片黄金圆盘。年夜梵天号令婆罗门把圆盘从上面开端按巨细挨次从头摆放正在另外一根柱子上。而且划定,正在小圆盘上不克不及放年夜圆盘,正在三根柱子之间一次只能挪动一个圆盘。
那里我们利用的办法是从特别到普通,那也是数教成绩中经常使用的办法。
起首我们设想一个盘,那便间接把那个盘从本身柱子移到目的柱。
其次我们看两个盘,三根柱子两个盘,先将上里的柱子挪动到中心柱,然后将最上面的柱子挪动到目的柱,最初中心的柱子。
再去看多个盘
123640utttvo4e4hts9af4.jpg

  1. int fibonacci(int n)
  2. {
  3.         int a = 1;
  4.         int b = 1;
  5.         int c = 1;
  6.         while (n > 2)
  7.         {
  8.                 c = a + b;
  9.                 a = b;
  10.                 b = c;
  11.                 n--;
  12.         }
  13.         return c;
  14. }
复造代码
田鸡跳台阶

一只田鸡能够一次跳 1 级台阶或一次跳 2 级台阶,比方:跳上第一级台阶只要一种跳法:间接跳 1 级便可。跳上两级台阶,有两种跳法: 每次跳 1 级,跳两次; 大要一次跳 2 级.问要跳上第 n 级台阶有几种跳法?
解题思绪
我们设台阶数位N;
当N=1时,固然只要1种跳法;
当N=2时,田鸡能够跳2次1层战跳1次2层;
当N=3时,当有3层台阶时,田鸡能够挑选先跳1层,剩下2层台阶,以是此时便是有2层台阶时的跳法,有2种;当田鸡挑选第一次跳2层台阶时,剩下1层台阶,此时有1层台阶时的跳法,以是3层台阶时的办法是:2层台阶的办法 + 1层台阶的办法。
  1. void hanno(int n, char a, char b, char c)
  2. {
  3.         if (n == 1)
  4.         {
  5.                 printf("%c->%c\n", a, c);
  6.         }
  7.         else
  8.         {
  9.                 hanno(n - 1, a, c, b);//递回处置,一开端的时分,先将n-1个盘子移至过渡柱z上后再将最底下的年夜盘子间接移至目的柱子y
  10.                 printf("%c->&c\n", a, c);
  11.                 hanno(n - 1, b, a, c);//然后反复以上步调,递回处置放正在过渡柱z上的n-1个盘子,
  12.         }
  13. }
复造代码
免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则