hevv 发表于 2011-4-16 20:22:14

对同一个题目:数学系的学生和计算机系的学生编写的程序

已经一个递归函数:
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;
}


很佩服数学系的人!

ilboyvm 发表于 2014-12-14 00:12:35

:cry:cry:cry:cry:cry:cry:cry

GHOST-DN 发表于 2014-12-14 11:23:19

他这样写也不好,没有程序的通用性。大家也不必自卑,有得必有失。学数学的思维和学计算机的不一样,但是也只是具体问题具体分析,俺是计算机的。程序如下

GHOST-DN 发表于 2014-12-14 11:32:51

#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;
}

GHOST-DN 发表于 2014-12-14 11:35:38

#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; }

GHOST-DN 发表于 2014-12-14 11:36:16

手机党。。。。伤不起啊啊啊

GHOST-DN 发表于 2014-12-14 11:38:05

应该是这样吧

仰望天上的光 发表于 2014-12-14 12:08:36

其实。。。这两种写法都是计算机系写的,第一种使用了递归,效率低;第2种将递归展开成循环;

真正的数学系的写法是:
1.在纸上求出f(n)的通项公式
2.编程直接代入通项公式
页: [1]
查看完整版本: 对同一个题目:数学系的学生和计算机系的学生编写的程序