母牛的故事(函数的递归)

什么是递归?

递归就是函数自己调用自己,就比如

#include<stdio.h>

void cir()
{

    printf("hehe\n");//打印hehe
    cir();//调用cir这个函数
}

int main()
{
    cir();//调用函数
    return 0;
}

但是这个写法是错误的,这是个死递归。所以一个完整的递归必须要有两点:

1.判断条件

2.递归层次不能太深,否则会导致栈溢出

3.每次都要接近条件

就拿斐波那契数列来举例:

1 1 2 3 5 8 13 21 34 55... ...

大事化小,将一件事逐渐拆分成不可在分的小事,用n来表示第n个斐波那契数列数,

        1,        n < 2

n=

        (n - 1) + (n - 2) ,        n > 2

当然,n也不能是负数。所以当n小于0时。值为0。

int Add(int n)
{
    if (n > 2)
    {
        return Add(n - 1) + Add(n - 2);
    }
    else if (n > 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}


int main()
{
    int input = 0;
    scanf("%d", &input);
    int sum = Add(input);
    printf("%d\n", sum);
    return 0;
}

这个写法虽然没错,但是当数字增加到50的时候运行速度就开始变慢了。

所以这时候就需要有优化代码了,一般的都是用迭代算法,也就是循环。

递归在特定情况下是挺好用的,比如经典的汉诺塔,青蛙跳台阶这两个事情。

这里我就不做过多赘述了。

接下来再说母牛的故事这个题:

我直接上传代码,其中被注释的是用递归写的,而没有被注释的是用迭代,也就是循环写的。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,
//每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
//(1 ,0 ,0 ,0 )  (1 ,1 ,0 ,0 )  (1 ,1 ,1 ,0 )  (1 ,1 ,1 ,1 )  (2 ,2 ,1 ,1 )  (3 ,3 ,2 ,1 )  (4 ,4 ,3 ,2 )
//   第一年            第二年            第三年            第四年        第五年            第六年            第七年
//      1             2              3              4                6                9                13
// 0  1  2  3     0  1  2  3     0  1  2  3     0  1  2  3     0  1  2  3     0  1  2  3     0  1  2  3
//可生育的母牛的今年的个数等于去年的母牛加上去年生长3年的母牛的个数
//生长1年的母牛的个数等于可生育母牛的个数
//生长两年的母牛的个数等于去年生长一年的母牛的个数
//生长三年的母牛的个数等于去年生长两年的母牛的个数

//extern int a0();
//extern int a1();
//extern int a2();
//extern int a3();
//
//int a3(int n)
//{
//    if (n == 2)
//    {
//        return 0;
//    }
//    else
//    {
//        return a2(n - 1);
//    }
//}
//
//int a2(int n)
//{
//    if (n == 2)
//    {
//        return 0;
//    }
//    else
//    {
//        return a1(n - 1);
//    }
//}
//
//int a1(int n)
//{
//    if (n == 1)
//    {
//        return 0;
//    }
//    else
//    {
//        return a0(n);
//    }
//}
//
//
//int a0(int n)
//{
//    if (n == 1)
//    {
//        return 1;
//    }
//    else
//    {
//        return a0(n - 1) + a3(n - 1);
//    }
//}
//
//int Cow(int n)
//{
//    return a0(n) + a1(n) + a2(n) + a3(n);
//}

int Cow(int n)
{
    int a = 1;
    int b = 0;
    int c = 0;
    int d = 0;
    int ret = 1;
    for (; n > 1;n-- )
    {
        int sw = 0;
        sw = a;
        a = a + d;
        d = c;
        c = b;
        b = a;
    }
    ret = a + b + c + d;
    return ret;


    /*if (n > 4)
    {
        return Cow(n - 4) + Cow(n - 3) + Cow(n - 2);
    }
    else if (n == 4)
    {
        return 4;
    }
    else if (n == 3)
    {
        return 3;
    }
    else if (n == 2)
    {
        return 2;
    }
    else if (n == 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }*/
}


int main()
{
    int years = 0;
again:
    scanf("%d", &years);
    do
    {
        if (years > 0)
        {
            int sum = Cow(years);
            printf("%d\n", sum);
            goto again;
        }
        else
        {
            break;
        }
    } while (years);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值