本文主要是介绍【尾递归】母牛的故事,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入格式
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
输出格式
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
样例输入
2 4 5 0
样例输出
2 4 6
说明:
什么叫递归呢?
递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
这个是百度搜的,这个自行百度看看如何用递归求解斐波那契数列,基本上就可以明白递归的用法了。
通过递归同样可以求解此题,利用递归算法的代码如下
#include <iostream>using namespace std;
int asd(int n)
{if (n == 1) return 1;if (n == 2) return 2;if (n == 3) return 3;if (n == 4) return 4;return asd(n - 1)+asd(n-3);
}int main()
{int a;while(cin>>a&&a!=0){cout<<asd(a)<<endl;}
}
这个答案都可以出来但是要注意后面的数非常大所以,int型有时并不适合,本题仅举例。
然后提交,发现:
tnnd,超时了。(这个自己百度并体会,会发现这个每调用一个数,就好像进入了一个循环一样,甚至你自己在编译过程中就会发现,数一旦大一点出结果就会很慢。
这是提交的情况:
所以尾插法解决了,因为我马上就要睡觉了,所以就大概解释一下,就是利用记录上一次递归的值来大大减少运算时间
先做一个比对
发现时间大大的缩短了,给你们发个代码体会一下不同,然后睡觉了,尾插法再百度搜搜
#include <iostream>using namespace std;
int asd(int n, int acc, int cal,int bwt)
{if (n == 1) return acc;if (n == 2) return cal;if(n==3) return bwt;return asd(n - 1,cal,bwt,acc+bwt);
}int main()
{int a;while(cin>>a&&a!=0){cout<<asd(a,1,2,3)<<endl;}
}
这篇关于【尾递归】母牛的故事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!