C语言第十课:递归函数

案例一

#include <stdio.h>

//求某数阶乘
int factorial(int n) 
{
    int result;
    if (n<0)
    {
        printf("输入错误!");
        return 0;
    }
    else if (n==0||n==1)
    {
        result = 1;
    }
    else
    {
        result = factorial(n - 1)*n;
    }
    return result;
}
int main()
{
    int n;
    printf("要求阶乘的数:\n");
    scanf_s("%d", &n);
    printf("结果为:%d", factorial(n));
    return 0;
}

案例二

#include <stdio.h>
/*小明为了学好英语,需要每天记单词。
第一天记1个,第二天记2个依次类推,
求到第n天的时候小明一共记了的单词总数。*/
int words(int n)
{
    int sum;
    if (n=1)
    {
        return 1;
    }
    else
    {
        sum = words(n - 1) + n;
    }
    return sum;
}
int main()
{
    int n;
    printf("学单词天数:\n");
    scanf_s("%d", &n);
    printf("一共学会了%d个单词。", words(n));
    return 0;
}

回顾案例
第六课:switch分支语句中用递归函数的方法计算天数同时引出注意事项

#include <stdio.h>

int monthday(int year,int month)
{
    int days;
    if (month==0)
    {
        return 0;
    }
    else if (month==1){days = 0;}
    else if (month == 2)
    {
        if ((year % 400 != 0)&(year % 4 == 0))
        {
            days = 29;
        }
        else
        {
            days = 28;
        }
    }
    else if (month==3){days = 31;}
    else if (month == 4){days = 30;}
    else if (month == 5){days = 31;}
    else if (month == 6){days = 30;}
    else if (month == 7){days = 31;}
    else if (month == 8){days = 31;}
    else if (month == 9){days = 30;}
    else if (month == 10){days = 31;}
    else if (month == 11){days = 30;}
    else{days = 31;}
    return days+= monthday(year,month - 1);
}
int main()
{
    int year, month, day;
    printf("输入要计算的日期:");
    scanf_s("%d.%d.%d", &year,&month, &day);
    printf("该日期是%d年的第%d天", year,monthday(year,month)+day);
    return 0;
}

注意事项

上述计算天数案例中,在使用递归函数调用自身的时候,不能直接用以下方式定义月份的天数:

    if (month==0)
    {
        return 0;
    }
    else if (month==1){days = 0;}
    else if (month == 2)
    {
        if ((year % 400 != 0)&(year % 4 == 0))
        {
            days = 29;
        }
        else
        {
            days = 28;
        }
    }

    else if (month==3,5,7,8,10,12){days = 31;}
    else{days = 31;}   //!!!错误方式
    return days+= monthday(year,month - 1);

因为递归函数严格按照顺序调用,正如案例一中求阶乘,假设n=5时,便是按照下图顺序运行:
阶乘

要点

  • 每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;
  • 每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;
  • 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;
  • 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;
  • 递归函数中必须有终止语句。如:上述计算天数若无当month==0时return 0将会逻辑错误;

一句话总结递归:自我调用且有完成状态。

本文链接:

https://www.zaigie.com/archives/95/