Problem
设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?

Input
本题有多组数据。每组数据只有一个整数N,独占一行。(1≤N≤50)

Output
对每组数据,输出一个整数(独占一行)表示第N年时母牛的数量

Sample Input
1
4
5
20

Sample Output
1
2
3
872

------------------------------------
最容易写出来的

解决方法很简单:母牛数等于自己加上它生的小牛数,再加上它的小牛们自己生的小牛,如此递归。

/*
此解答未被Accept
原因:运算时间超时(1200ms,而时间限制在1000ms)
*/
#include<stdio.h>

int F(int n)
{
 int res = n<4?0:n-3;//该母牛所生的小牛数

if(n>=4)
 {
  for(int i=1; i<=n-3; i++)//该母牛的每一个孩子再生小牛。
  {
   res += F(i);
  }
 }

return res;
}

int main()
{
 int n;

while( scanf("%d",&n) != EOF)
 {
  printf("%d\n",F(n)+1);
 }

return 0;
 
}

上面解答的弱点是,重复计算(比如F(1)被。每一个小牛掉用了,被每一个小牛的每一个孩子调用了,如此重复下去),导致时间开销很大。
----------------------------
改进的:

为了避免重复运算,我们将用一个数组保存已经被计算过的值,由于函数F的任何计算的结果都不会是
-1,那么我们设置数组的初始值为-1,但检查到其值不为-1时,那么它已经被计算过了,我们就没有必要再计算了。

/*
此解答已通过TongJi编译,并接收
 User        Result   Memory Time  Language Date 
 zhouyinhui  Accepted 56 k   2ms   C++      2006-05-06 16:32:02
*/
 
#include<stdio.h>
#include<malloc.h>

int* arr;//用于保存运算结果,避免递归调用中的重复运算

int F(int n)
{
 int res = n<4?0:n-3;

if(n>=4)
 {
  
  for(int i=1; i<=n-3; i++)
  {
   if( *(arr+i) == -1 )//如果未运算该F(i)
   {
    *(arr+i) = F(i);//则运算并保存结果
   }
   res += *(arr+i);

}
  
 }

return res;
}

int main()
{
 int n;

while( scanf("%d",&n) != EOF)
 {
  int *array = (int *)malloc(n*4);
  for(int i=0; i<n; i++)
  {
   *(array+i) = -1;
  }

arr = array;

printf("%d\n",F(n)+1);
 }

return 0;
 
}

转载于:https://www.cnblogs.com/zhouyinhui/archive/2006/05/06/392719.html

小问题,对递归重复调用的改进,一起来分享相关推荐

  1. 【FLink】Flink SQL代码生成与UDF重复调用的优化

    1.概述 转载:Flink SQL代码生成与UDF重复调用的优化 2. 代码生成简介 代码生成(code generation)是当今各种数据库和数据处理引擎广泛采用的物理执行层技术之一.通过代码生成 ...

  2. Java—重复调用的代码块—方法

    对 java 知识点重新进行了总结与更新,点我查看 在面向对象的程序设计中,方法是一个很重要的概念,体现了面向对象三大要素中"封装"的思想."方法"又被称为&q ...

  3. post 防篡改_安全|API接口安全性设计(防篡改和重复调用)

    API接口的安全性主要是为了保证数据不会被篡改和重复调用,实现方案主要围绕Token.时间戳和Sign三个机制展开设计. 1. Token授权机制 用户使用用户名密码登录后服务器给客户端返回一个Tok ...

  4. python重复执行函数_Python threading 单线程 timer重复调用函数

    项目中需要使用定时器,每次都使用构造器函数调用: timer = threading.Timer(timerFlag, upload_position) timer.start() 打印线程后发现,每 ...

  5. C++之多重继承引发的重复调用

    #include "stdafx.h" #include<stdlib.h> #include<iostream> using namespace std; ...

  6. mysql百万级去重_mysql优化小技巧之去除重复项(百万级数据)

    mysql优化小技巧之去除重复项(百万级数据) 发布时间:2018-06-11 11:54, 浏览次数:482 , 标签: mysql 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候.毕竟咱不 ...

  7. 【递归算法01】递归的调用机制

    方法的递归调用 目录: 方法的递归调用 1. 基本介绍: 2. 递归能解决什么问题? 3. 递归举例分析: 3.1 打印问题: 3.2 阶乘问题: 递归的重要规则: 1. 基本介绍: 简单地说,递归就 ...

  8. Unity延迟和重复调用方法

    延迟调用方法 Invoke(arg1,arg2) arg1 是延迟调用的字符串方法名,arg2是延迟多少时间调用arg1 方法. 重复调用方法 InvokeRepeating(arg1,arg2,ar ...

  9. java 多线程 数据重复,java 多线程 出现数据重复调用有关问题

    java 多线程 出现数据重复调用问题 线程操作过程描述: 1.线程查询数据库表(table1)数据,并遍历修改记录状态(防止出现数据重复调用).(此操作加入了同步锁) 2.调用接口,获取返回的状态. ...

最新文章

  1. RDChiral | 用于处理立体化学的RDKit封装器
  2. Python开发基础总结之函数+闭包+字典+列表
  3. iOS:自定义模态动画 --UIPresentationController
  4. python官网的软件好用吗-为何强烈不推荐去学python?
  5. 【Android 安装包优化】Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )
  6. when is Component-preload.js loaded by UI Framework
  7. 方差和协方差的数据意义
  8. publiccms实现多层级选项卡效果
  9. 请问如何让Dundas chart for asp.net控件产生的临时图片文件减少一些?
  10. linux release 版本的区别,编译debug版本和编译release版本的区别
  11. fastreport文本字数太多换行_Python教程第10篇:聊聊print换行输出和重复多次打印...
  12. linux tcp文件分包_在Linux下基于TCP协议的文件传输程序.
  13. 显微镜自动聚焦原理是什么_自动玻璃感应门原理是什么?看看东莞装修网怎么说...
  14. 让云触手可及——微软云计算解决方案白皮书
  15. maven 常用命令
  16. PKI密码学学习笔记
  17. Error: Can't resolve 'fs' in (webpack 2配置CSS loadeers)
  18. Python学习笔记之八皇后问题
  19. codevs 2147 数星星
  20. [深入研究4G/5G/6G专题-56]: L3信令控制-5-无线承载DRB管理

热门文章

  1. 创建型模式二:工厂方法模式
  2. 《企业软件交付:敏捷与高效管理精要》——3.4 企业软件交付的软件工厂方法...
  3. Saltstack 报错 python-crypto randomPool_DeprecationWarning:
  4. 双拓扑排序 HDOJ 5098 Smart Software Installer
  5. Flex与Java通信之HttpService方式
  6. R学习之——R用于文本挖掘(tm包)
  7. 安装Frida抓包工具
  8. linux bash函数里面调用命令行,Linux-在gnome-terminal -x中运行bash函数
  9. java同名变量在list中添加两次_快速解决List集合add元素,添加多个对象出现重复的问题...
  10. cifs mount 挂载共享目录_安装cifsutils解决linux挂载windows共享文件夹