小问题,对递归重复调用的改进,一起来分享
2006-05-06 17:52
357 查看
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;
}
设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第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;
}
相关文章推荐
- 小问题,对递归重复调用的改进,一起来分享
- 小问题,对递归重复调用的改进,一起来分享
- SQL SERVER树型数据处理时,函数递归调用问题,查询根节点,子节点函数
- 新浪微博分享多个页面回调不能直接回到调用的Activity问题
- 集合的全排列问题-递归实现方式的改进---旋转法
- 解决Timer回调方法重复调用的问题
- 分书问题,递归调用
- 【C语言的递归调用】汉罗塔问题心得
- 关于cocos2d::Scheduler的调用重复次数问题
- js 递归调用无返回值的问题
- CocoaPods 原理分享及遇到的问题改进
- spring集成quartz会重复调用2次的问题
- 主题:spring集成quartz,出现2次重复调用的问题
- 每日学习总结:CSS:Clear属性的用法、重复交易提示框、弹出提示框后页面变形、asp.net调用smtp服务发送邮件问题
- Java 调用 .Net Web Service 问题解决方法分享
- 改进的单例模式,解决并发生成多实例问题,并且提高调用时的性能
- 调用c++递归库文件解决背包问题
- [Java实现]Filbonacci斐波那契数列递归带来的问题和改进
- 递归实现随机数不重复问题
- 关于ListView中getView被重复调用的问题