鱼C论坛

 找回密码
 立即注册
查看: 1839|回复: 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)速度非常缓慢

  1. import functools

  2. @functools.lru_cache()
  3. def getnum(year):
  4.     if year > 1:
  5.         num = getnum(year - 1) + getnum(year - 3)
  6.         return num
  7.     else:
  8.         return 1
  9.    
  10. while True:
  11.     n = input("输入n:")
  12.     if n == "0":
  13.         break
  14.     print(getnum(int(n)))
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


  2. int main()
  3. {
  4.     int n;
  5.     int count[70];
  6.     count[0] = count[1] = count[2] = 1;
  7.     count[3] = 1;
  8.     while(1)
  9.     {
  10.         scanf("%d",&n);
  11.         if(n == 0)
  12.             break;
  13.         int index = 1;
  14.         while(index <= n)
  15.         {
  16.             count[index+3] = count[index+2] + count[index];
  17.             index++;
  18.         }
  19.         printf("%d",count[n+2]);
  20.     }

  21.     return 0;
  22.    
  23. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. @functools.lru_cache()
  3. def getnum(year):
  4.     if year > 1:
  5.         num = getnum(year - 1) + getnum(year - 3)
  6.         return num
  7.     else:
  8.         return 1
  9.    
  10. while True:
  11.     n = input("输入n:")
  12.     if n == "0":
  13.         break
  14.     print(getnum(int(n)))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-7 10:33:26 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. count.append(1)
  3. count.append(1)
  4. count.append(1)
  5. count.append(1)

  6. while True:
  7.     n = eval(input())
  8.     if n == 0:
  9.         break
  10.     index = 1
  11.     while index <= n:
  12.         result = count[index+2] + count[index]
  13.         count.append(result)
  14.         index += 1
  15.     print(count[n+2])
  16.         

  17.         
复制代码

代码比较冗余,但是速度可以
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

答案是正确的,但是运行getnum(54)速度非常缓慢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. import functools

  2. @functools.lru_cache()
  3. def getnum(year):
  4.     if year > 1:
  5.         num = getnum(year - 1) + getnum(year - 3)
  6.         return num
  7.     else:
  8.         return 1
  9.    
  10. while True:
  11.     n = input("输入n:")
  12.     if n == "0":
  13.         break
  14.     print(getnum(int(n)))
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

运行速度很快,但是没有用到递归,有没有速度快的递归方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

看我给你的新的  速度飞起
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这是什么神奇的方法,能给我讲解一下吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

原理我也不懂啊,就是知道 这个修饰符 可以极大幅度加快递归运算速度
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的谢谢,我写的代码也是因为效率问题一直显示超时。
学到了让递归运算起飞的新方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-28 04:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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