当前位置: 首页 > article >正文

1004[递归]母牛的故事

最近简单复习了一下 python 编码的方法,以此记录一些笔记,本博客仅用于记录算法学习
好久没有刷过算法题,递归算法竟然忘记如何使用了,简单记录一下递归的思想以及递归需要满足的条件。
递归算法:一种直接或者间接调用自身函数或者方法的算法。实质上就是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来求问题的解。

递归满足的条件:

  • 一个问题的解可以分解为几个子问题的解;
  • 这个问题与分解之后的子问题,除了数据规模不同,求解思路一样;
  • 存在基线与终止条件。

优缺点:

  • 优点:简单,容易上手
  • 缺点:运行效率低,容易出现超时或者超出内存等问题;并且在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归太深,容易发生栈溢出。

下面这个例题,来源于C语言网吧中的习题中的1004,

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

  • 输入格式
    输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
    n=0表示输入数据的结束,不做处理。
  • 输出格式
    对于每个测试实例,输出在第n年的时候母牛的数量。每个输出占一行。

样例输入:
2
4
5
0
样例输出:
2
4
6

经过分析,我得到了一个关系式:
f = { n if  n < = 4 f ( n − 1 ) + f ( n − 3 ) if  n > 4 f = \begin{cases} n &\text{if } n<=4 \\ f(n-1)+f(n-3) &\text{if } n>4 \end{cases} f={nf(n1)+f(n3)if n<=4if n>4
我编写的递归算法如下所示:

def cow(year):
    if year <= 4:
        return year
    else:
        return cow(year-1) + cow(year-3)

while True:
    n = int(input())
    if n == 0:
        break
    else:
        print(list1[n])
        

提交后,系统显示超出内存。经过查看题解之后,改使用循环了。

list1 = [0, 1, 2, 3]
for i in range(4, 1000):
    list1.append(list1[i-1]+list1[i-3])

while True:
    n = int(input())
    if n == 0:
        break
    else:
        print(list1[n])

这个就没有任何问题了,事实证明,在某些情况下,使用递归容易出现溢出内存或者超时等错误。我们可以对其进行稍稍的修改。


http://www.kler.cn/a/8218.html

相关文章:

  • 《基于深度学习的车辆行驶三维环境双目感知方法研究》
  • Python教程笔记(1)
  • LED和QLED的区别
  • 2.操作系统常见面试问题2
  • C++常用的特性-->day05
  • 开源数据库 - mysql - xtrabackup工具进行备份
  • cmake 常用方法自我总结
  • 通过阿里云函数计算解决ChatGPT API的调用问题
  • 算法训练第四十九天 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II
  • python教程requests详解
  • entos7系统部署网站项目教程【超详细教程】
  • 实践分享:如何在自己的App 中引入AI 画图
  • Web前端如何防止被恶意调式?
  • JS 数组排序方法 - sortFun
  • Kotlin 面向对象(二)
  • Redis —缓存常见异常
  • 父子组件传值问题
  • Ludwig Otto Hölder
  • php企业公司员工考勤加班系统
  • 面试被问到:测试计划和测试方案有什么区别?
  • 派盘为您的个人数据安家
  • 一篇文章,弄懂蓝牙协议怎么看,进军物联网!
  • 【WCH】基于Keil环境CH32F203 GPIO点灯实验
  • 全国青少年电子信息智能创新大赛(复赛)python·模拟三卷,含答案解析
  • 1mm³大小,世界首个功率破KW的单芯片激光模组诞生
  • Unity入门开发资源链接