鱼C论坛

 找回密码
 立即注册
查看: 1339|回复: 11

[已解决][递归]母牛的故事

[复制链接]
发表于 2021-2-7 10:04:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

输入
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。

输出
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。

样例输入
2
4
5
0

样例输出
2
4
6


要求:当n数值较大时,程序速度尽可能快
最佳答案
2021-2-7 11:15:54
逃兵 发表于 2021-2-7 11:10
答案是正确的,但是运行getnum(54)速度非常缓慢

import functools

@functools.lru_cache()
def getnum(year):
    if year > 1:
        num = getnum(year - 1) + getnum(year - 3)
        return num
    else:
        return 1
    
while True:
    n = input("输入n:")
    if n == "0":
        break
    print(getnum(int(n)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-7 10:19:52 | 显示全部楼层
#include<stdio.h>


int main()
{
    int n;
    int count[70];
    count[0] = count[1] = count[2] = 1;
    count[3] = 1;
    while(1)
    {
        scanf("%d",&n);
        if(n == 0)
            break;
        int index = 1;
        while(index <= n)
        {
            count[index+3] = count[index+2] + count[index];
            index++;
        }
        printf("%d",count[n+2]);
    }

    return 0;
   
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 10:26:18 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-2-7 11:17 编辑
import functools

@functools.lru_cache()
def getnum(year):
    if year > 1:
        num = getnum(year - 1) + getnum(year - 3)
        return num
    else:
        return 1
    
while True:
    n = input("输入n:")
    if n == "0":
        break
    print(getnum(int(n)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-7 10:33:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 11:04:38 | 显示全部楼层
本帖最后由 小甲鱼的铁粉 于 2021-2-7 11:06 编辑
count = []

count.append(1)
count.append(1)
count.append(1)
count.append(1)

while True:
    n = eval(input())
    if n == 0:
        break
    index = 1
    while index <= n:
        result = count[index+2] + count[index]
        count.append(result)
        index += 1
    print(count[n+2])
        

        
代码比较冗余,但是速度可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-7 11:10:39 | 显示全部楼层

答案是正确的,但是运行getnum(54)速度非常缓慢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 11:15:54 | 显示全部楼层    本楼为最佳答案   
逃兵 发表于 2021-2-7 11:10
答案是正确的,但是运行getnum(54)速度非常缓慢

import functools

@functools.lru_cache()
def getnum(year):
    if year > 1:
        num = getnum(year - 1) + getnum(year - 3)
        return num
    else:
        return 1
    
while True:
    n = input("输入n:")
    if n == "0":
        break
    print(getnum(int(n)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-7 11:17:11 | 显示全部楼层
小甲鱼的铁粉 发表于 2021-2-7 11:04
代码比较冗余,但是速度可以

运行速度很快,但是没有用到递归,有没有速度快的递归方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 11:18:04 | 显示全部楼层
逃兵 发表于 2021-2-7 11:17
运行速度很快,但是没有用到递归,有没有速度快的递归方法

看我给你的新的  速度飞起
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-7 11:20:17 | 显示全部楼层
qq1151985918 发表于 2021-2-7 11:18
看我给你的新的  速度飞起

这是什么神奇的方法,能给我讲解一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 11:23:17 | 显示全部楼层
逃兵 发表于 2021-2-7 11:20
这是什么神奇的方法,能给我讲解一下吗

原理我也不懂啊,就是知道 这个修饰符 可以极大幅度加快递归运算速度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-7 11:28:04 | 显示全部楼层
qq1151985918 发表于 2021-2-7 11:23
原理我也不懂啊,就是知道 这个修饰符 可以极大幅度加快递归运算速度

好的谢谢,我写的代码也是因为效率问题一直显示超时。
学到了让递归运算起飞的新方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 13:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表