欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

函数递归

程序员文章站 2022-07-12 09:54:25
...

递归

  • 定义:直接间接在函数体内调用函数本身,实现循环

直接:在函数体本身调用自己函数本身。
间接:例如:存在2个函数fun1()和fun2()那么,在fun1()函数中调用fun2()函数,在fun2()函数中调用fun1()函数。

  • 注意事项:任何一个函数体内不能出现其他函数的定义

n!的递归算法

#include <stdio.h>
int jc(int n); 
int main()
{
    int n;
    scanf ("%d",&n);
    printf ("%d\n",jc(n));  
}
int jc(int n)
{
    int f=1;
    if(n==0)
        return 1;
    else
        f=n*jc(n-1);    
    return f;
}

以n==4为例
函数递归
函数递归,最难理解的就是如何返回,这张图片很好的介绍了函数的返回。

冒泡排序的递归算法

  • 思路:将最大数放置最后,再讲次大数放置在倒数第2位,以此类推
  • 代码实现
for(int i=0;i<n;i++)
  for(int j=0;j<n-i;j++)
    if(a[j]<a[j+1]
      swap(a[j],a[j+i])
  • 由此可知,递归的出口就是i>=n,i,j的变换条件是j>=n-i。
void mppx(int n,int i,int j,int a)
{
    if(i>=n)
         return ;
    else if(j>=n-i)
         i++,j=0;
    if(a[j]<a[j+1])
         swap(a[j],a[j+1])
    mppx(n,i,j,a);
}

这个swap()函数,可以使用库函数,也可以自己定义函数。

swap(int *p1,int *p2)
{
  int a;
  a=*p1;
  *p1=*p2;
  a2=a;
}
main()
{
  int m,n;
  scanf ("%d%d",&m,&n);
      if(m>n)
         swap(&m,&n);
  printf ("%d,%d",m,n); 
}

函数的难点就是函数递归,对于循环问题都可以用递归来写。

递归与循环

  • 递归函数会重复调用自身函数。
  • 无限循环将继续重复执行相同的代码。

虽然听起来两者非常相似,但实际效果却截然不同。

  • 递归:在无数次调用的时候,变量会被压入堆栈区,即函数递归的次数存在限制,也就是说,实际中运行无限递归时,耗尽堆栈空间,程序停止,当然它很有可能会使堆栈溢出,然后*结束。
  • 循环:while循环会一直使用相同的空间,因此循环可以永远运行,最起码到电源熄灭之前。