鱼C论坛

 找回密码
 立即注册
查看: 2535|回复: 7

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

[复制链接]
发表于 2011-4-16 20:22:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


很佩服数学系的人!
最佳答案
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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2014-12-14 00:12:35 | 显示全部楼层
:cry:cry:cry:cry:cry:cry:cry

评分

参与人数 1鱼币 -5 收起 理由
小甲鱼 -5 请不要无意义灌水!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-14 11:23:19 From FishC Mobile | 显示全部楼层
他这样写也不好,没有程序的通用性。大家也不必自卑,有得必有失。学数学的思维和学计算机的不一样,但是也只是具体问题具体分析,俺是计算机的。程序如下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-14 11:35:38 From FishC Mobile | 显示全部楼层
#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; }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-14 11:36:16 From FishC Mobile | 显示全部楼层
手机党。。。。伤不起啊啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-14 11:38:05 From FishC Mobile | 显示全部楼层
应该是这样吧
Screenshot_2014-12-14-11-36-47.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-14 12:08:36 | 显示全部楼层
其实。。。这两种写法都是计算机系写的,第一种使用了递归,效率低;第2种将递归展开成循环;

真正的数学系的写法是:
1.在纸上求出f(n)的通项公式
2.编程直接代入通项公式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 12:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表