[problem2]欧拉
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
这里要注意的就一点:递归不是什么时候都好使的。这里的情况,一是4million是Fibonacci中的第n项的值,如果想用递归来逐个判断序列中的每一项,需要先求出4million对应的n是多少;并且,递归层次会不会太深导致stack overflow?非常需要考虑。
这个问题的解,其实避开定势思维“见到Fibonacci序列就想递归”,很简单:这个序列的规则就是下一项是前两项的和,那何必麻烦递归,自己逐个算出序列中的每一项并顺便判断是否偶数并做累加,就了了。另外:如果是求解这个序列中的第n项,也可以不用递归。还是这个方法从前往后逐个算每一项,用一个变量记录共算出了多少项了,当找到第n项时,break出循环,了了。
View Code #include <iostream>
using namespace std;
//int Fibonacci(int n, long long& sum)
//{
// if(n == 1) return 1;
// else if(n == 2)
// {
// sum += 2;
// return 2;
// }
//
// int val = Fibonacci(n-2, sum) + Fibonacci(n-1, sum);
// if(val%2 == 0)
// {
// sum += val;
// }
// return val;
//}
int _tmain(int argc, _TCHAR* argv[])
{
long long sum = 2;
int preNum1 = 2;
int preNum2 = 3;
int k = preNum1 + preNum2;
while(k < 4000000)
{
if(k%2 == 0)
{
sum += k;
}
preNum1 = preNum2;
preNum2 = k;
k = preNum1 + preNum2;
}
cout << "sum:" << sum << endl;
return 0;
}
using namespace std;
//int Fibonacci(int n, long long& sum)
//{
// if(n == 1) return 1;
// else if(n == 2)
// {
// sum += 2;
// return 2;
// }
//
// int val = Fibonacci(n-2, sum) + Fibonacci(n-1, sum);
// if(val%2 == 0)
// {
// sum += val;
// }
// return val;
//}
int _tmain(int argc, _TCHAR* argv[])
{
long long sum = 2;
int preNum1 = 2;
int preNum2 = 3;
int k = preNum1 + preNum2;
while(k < 4000000)
{
if(k%2 == 0)
{
sum += k;
}
preNum1 = preNum2;
preNum2 = k;
k = preNum1 + preNum2;
}
cout << "sum:" << sum << endl;
return 0;
}


浙公网安备 33010602011771号