背景
网上看到一道招银网络科技的笔试编程题,修改了原博客的错误并添加了讲解:
题目:
题目摘抄自 这里
假设每只母牛从出生后,次年后的每年年初会生下两只母牛,并且随着年份的增加每年成倍数死亡,即第1年死2只母牛。第2年死22只,第3年死3*2只依次类推(题目没懂得看下面的就可以了)
问题:假设第一年年初时,有10头母牛,第二年年初后有28头母牛,类推,问第100年的年初出生后,有多少只母牛,请在java/c++之间选择一种编程语言,用递归的方法求解并完成代码的编写。
代码
#include<iostream>
//author: hmtian @2020/6/21
int CalCow(int cow, int year, int years) //year 代表第一年,years代表共多少年
{
while( year+1 <= years) //注意是year + 1
{
cow = cow*3 - year*2;
year++;
CalCow(cow, year, years);
}
return cow;
}
int main()
{
int cow = CalCow(10,1,3); //这里以第三年为例
std::cout <<" cows:" << cow << std::endl;
return 0;
}
讲解:
第一年:10
第二年:10 + 10*2 - 1 == 28 == 10*3 -2
第三年:28 + 28*2 -2*2 == 80 == 28*3 -4
第四年:80 + 80*2 -2*3 == 234 == 80*3 -6
以此类推...
这就是为什么计算表达式为:cow = cow*3 - year*2;
结果: