对同一个题目:数学系的学生和计算机系的学生编写的程序
已经一个递归函数:f(1)=f(2)=1;
f(n)=f(n-1)+f(n-2)!
求f(30)=?
一般的人都是这样编写的(我也是这样编写的)
#include <iostream>
using namespace std;
int fun(int );
int main()
{
cout<<fun(30);
return 0;
}
int fun(int n)
{
if(n<=2)
return 1;
else
return fun(n-1)+fun(n-2);
}
今天看到数学系的一个学生是这样完成的:
#include <iostream>
using namespace std;
int main()
{
int a=1,b=1,c;
for(int i=0;i<10;++i) //a.b.c.a.b.c.a.b.c.a.b.c.....看成一个数列!
{
c=a+b;
a=b+c;
b=c+a;
}
cout<<c<<endl;
return 0;
}
很佩服数学系的人! :cry:cry:cry:cry:cry:cry:cry 他这样写也不好,没有程序的通用性。大家也不必自卑,有得必有失。学数学的思维和学计算机的不一样,但是也只是具体问题具体分析,俺是计算机的。程序如下 #include <iostream>
using namespace std;
int main()
{
cout<<fun(29)<<endl;
return 0;
}
int fun(int n)
{
int a=1,b=1,c=0;
for(int i=0;i<n/3;++i)
{
c=a+b;
a=b+c;
b=c+a;
}
if(n%3==0) return c;
if(n%3==1) return a;
if(n%3==2) return b;
} #include <iostream> using namespace std; int main() { cout<<fun(29)<<endl; return 0; }int fun(int n) { int a=1,b=1,c=0; for(int i=0;i<n/3;++i) { c=a+b; a=b+c; b=c+a; } if(n%3==0) return c; if(n%3==1) return a; if(n%3==2) return b; } 手机党。。。。伤不起啊啊啊 应该是这样吧 其实。。。这两种写法都是计算机系写的,第一种使用了递归,效率低;第2种将递归展开成循环;
真正的数学系的写法是:
1.在纸上求出f(n)的通项公式
2.编程直接代入通项公式
页:
[1]