五、递归函数

一、递归函数

函数自己调用自己

本质:循环

可控循环的三要素:

  循环控制变量,并且有初始值
  循环控制变量的变化
  循环停止条件

二、输出54321

2.1 for循环实现

// for 循环
#include<stdio.h>

int main(void)
{
    int i;
    for(i = 5; i>0; i--)
    {
        printf("%d\n",i);
    }
    return 0;
} 

2.2 递归实现54321

2.2.1 代码实现

// 递归函数
#include<stdio.h>

void fun(int n)
{
    if (n>0)
    {
        printf("%d\n",n);
        fun(n-1);
        printf("%d\n",n);
    }
}

int main(void)
{     
    fun(5);
    return 0;
} 

// 结果 5 4 3 2 1 1 2 3 4 5

2.2.2 逻辑解释

// 上述示例的本质
void fun(5)
{
    if (n>0)
    {
        printf("%d\n",n);   // 5
        void fun(4)
        {
            if (n>0)
            {
                printf("%d\n",n); // 4
                void fun(3)
                {
                    if (n>0)
                    {
                        printf("%d\n",n); // 3
                        void fun(2)
                        {
                            if (n>0)
                            {
                                printf("%d\n",n); // 2
                                void fun(1)
                                {
                                    if (n>0)
                                    {
                                        printf("%d\n",n); // 1
                                        fun(n-1);
                                        printf("%d\n",n); // 1
                                    }
                                }
                                printf("%d\n",n); // 2
                            }
                        }
                        printf("%d\n",n); // 3
                    } 
                }
                printf("%d\n",n); // 4
            }
        }
        printf("%d\n",n); // 5
    }
}

三、斐波拉契函数

// f(n) = f(n-1) + f(n-2)
// n=1 f(n)=1
// n=2 f(n)=1

#include<stdio.h>

int fun(int n)
{
    if(n == 1)
    {
        return 1;
    }
    else if (n == 2)
    {
        return 1;
    }
    else
    {
        return fun(n-1) + fun(n-2);
    }
    
}

int main(void)
{     
    int a = fun(6);
    printf("%d\n",a); // 8
    return 0;
} 

四、实现阶乘

#include<stdio.h>

int fun1(int n)
{
    if (n == 1)
    {
        return 1;
    }
    else
    {
        return n*fun1(n-1);
    }
}

int main(void)
{     
    int b = fun1(5);
    printf("%d\n", b);
    return 0;
} 

五、递归的注意点

1. 递归层数不能太多,会stackflow
2. 递归比循环效率低
3. 递归难于阅读难于维护
4. 某些情况下,递归写法更简洁

 

posted on 2020-11-05 22:35  软饭攻城狮  阅读(225)  评论(0编辑  收藏  举报

导航