算法练习Day7

112 阅读1分钟

题目描述

有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。

例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。

一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?

数据范围:输入满足 1≤n≤31

题目来源

题目来源(www.nowcoder.com/practice/12…)

输入描述

输入一个int型整数表示第n个月

输出描述:

输出对应的兔子总数

输入:
3
输出:
2

思路

这道题简单列个表后发现规律是斐波那契数列,按斐波那契写即可

具体实现

#include<stdio.h>
#include<stdlib.h>
#include <iostream>
using namespace std;
​
​
int rabbit(int n)
{
    if (n == 1)return 1;
    if (n == 2)return 1;
    int sum = 1;
    if (n >3)
    {
        sum = rabbit(n - 2) + rabbit(n - 1);
    }
    return sum;
}
​
​
int main()
{   
    int n;
    scanf("%d", &n);
    int m = rabbit(n);
    printf("%d", m);
}

时间复杂度

斐波那契数列的时间复杂度好像有大佬有争议,约定俗成的是O(n^2)

小结

这道题列出几个例子会发现是斐波那契,但是如果在不知晓斐波那契数列的情况下,如何找出兔子的递归规律我没找出来,晚点去看看有没有大佬不用斐波那契的方法递归出来。