C语言——递归

目录:

一:定义

二.通俗易懂的例子

三.语法格式

四.流程图

五:递归的弊端

六:什么条件下可以采用递归方法来解决问题

1、可以把要解决的问题转化为一个新问题

2.可以应用这个转化过程使问题得到解决

3.必定要有一个明确的结束递归的条件

实例1【数的阶乘】

实例2【斐波那契数列】


一:定义

递归指的是在函数的定义中使用函数自身的方法

在使用递归时,程序员需要注意定义一个从函数退出的条件否则会进入死循环

二.通俗易懂的例子

从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'"

三.语法格式

void recursion()
{
   statements;
   ... ... ...
   recursion(); /* 函数调用自身 */
   ... ... ...
}
 
int main()
{
   recursion();
}

四.流程图

五:递归的弊端

递归是一个简洁的概念,同时也是一种很有用的手段

但是,使用递归是要付出代价的

直接的语句(如while循环)相比,递归函数会耗费更多的运行时间,并且要占用大量的栈空间

递归函数每次调用自身时,都需要把它的状态存到栈中,以便在它调用完自身后,程序可以返回到它原来的状态

未经精心设计的递归函数总是会带来麻烦

六:什么条件下可以采用递归方法来解决问题

1、可以把要解决的问题转化为一个新问题

这个新的问题的解决方法与原来的解决方法相同

只是所处理的对象有规律地递增或递减

 解决问题的方法相同

调用函数的参数每次不同(有规律的递增或递减)

如果没有规律也就不能适用递归调用

2.可以应用这个转化过程使问题得到解决

使用其他的办法比较麻烦很难解决

使用递归的方法可以很好地解决问题

3.必定要有一个明确的结束递归的条件

一定要能够在适当的地方结束递归调用

不然可能导致系统崩溃

实例1【数的阶乘

#include <stdio.h>
 
double factorial(unsigned int i)
{
   if(i <= 1)
   {
      return 1;
   }
   return i * factorial(i - 1);
}
int  main()
{
    int i = 15;
    printf("%d 的阶乘为 %f\n", i, factorial(i));
    return 0;
}

运行结果:

15 的阶乘为 1307674368000.000000

实例2【斐波那契数列】

#include <stdio.h>
 
int fibonaci(int i)
{
   if(i == 0)
   {
      return 0;
   }
   if(i == 1)
   {
      return 1;
   }
   return fibonaci(i-1) + fibonaci(i-2);
}
 
int  main()
{
    int i;
    for (i = 0; i < 10; i++)
    {
       printf("%d\t\n", fibonaci(i));
    }
    return 0;
}

运行结果:

0    
1    
1    
2    
3    
5    
8    
13    
21    
34
发布了148 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/liu17234050/article/details/104216860
今日推荐