Board logo

标题: 无聊了- -3种方法实现20个斐波那契数生成。 [打印本页]

作者: liuyanghejerry    时间: 2010-4-11 17:00     标题: 无聊了- -3种方法实现20个斐波那契数生成。

无聊了,3种方法实现20个斐波那契数生成。
为什么是20个呢?一来int型的空间太小了,如果我写100个的话,绝对会越界;二来模板元的展开级数默认是500层,再多还得改编译器参数,这样很蛋疼- -
均为C++代码。
第一种方法是while语句循环;
第二种方法是函数迭代,也就是递归函数;
第三种方法是模板元编程。
复制内容到剪贴板
代码:
#include <iostream>
using namespace std;
//////////////////////////////////////
//方法一
/*
int main()
{
int a=0,b=1,i=0;
while(i<20)
{
cout<<a<<","<<b<<",";
a+=b;
b+=a;
i++;
}
getchar();
}
*/
//////////////////////////////////////
//方法二
/*
void Feb(int & a,int & b,int & i)
{
if(i==0)  
  return ;
cout<<a<<","<<b<<",";
a+=b;
b+=a;
Feb(a,b,--i);
}
int main()
{
int a0=0,b0=1,i=20;
Feb(a0,b0,i);
getchar();
return 0;
}
*/
//////////////////////////////////////
//方法三
/*
template <int i>
class Feblar
{
public:
static void Feb(int a=0,int b=1)
{
cout<<a<<","<<b<<",";
a+=b;
b+=a;
Feblar<i-1>::Feb(a,b);
}
};

template<>
class Feblar<0>
{
public:
static void Feb(int a,int b)
{
}
};

int main()
{
Feblar<20>::Feb();
getchar();
}  
*/
//////////////////////////////////////

作者: roywillow    时间: 2010-4-11 18:10

其实斐波那契数列是有个通项公式的
带根号
不清楚在int中经过取舍会不会成为正常的项……

然后经过测试惊奇的发现竟然直接输出整数……?

#include <iostream>
#include <cmath>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int n;
for (n=1; n < 21; n++) {
  cout<<(pow((1+sqrt(5.0))/2,n)-pow((1-sqrt(5.0))/2,n))/sqrt(5.0)<<',';
}
getchar();
return 0;
}

嫌多输出一个逗号的话把for中上界改成20,然后在后面再来句没有逗号的cout

[ 本帖最后由 roywillow 于 2010-4-11 18:35 编辑 ]
作者: liuyanghejerry    时间: 2010-4-11 19:38

你的main好奇怪…

int任何时候都会是整数的,如果被除或者怎样有小数,就会直接去除小数只留整数…

sqrt如果返回小数,就会生成临时变量的貌似。
作者: roywillow    时间: 2010-4-11 20:39

不过我没进行赋值
而是直接cout,那样也是直接取整?

main函数那个是带参数的形式
进行含参程序设计就用那个
bcb和vc的控制台程序似乎都是这样的啊

因为要连续输出20个数字,所以那个递归感觉很别扭呢……
如果只是求某个数字会相当简单的
不过递归似乎是效率最低的算法了

[ 本帖最后由 roywillow 于 2010-4-11 20:40 编辑 ]
作者: liuyanghejerry    时间: 2010-4-12 07:45

没错,这就是模板元出现的理由啊,大幅提高迭代的运行时效率…

我不解的是_t,你要带参数的话也不用写成这样吧…我记得写扩容程序的时候,用main就可以了,_tmain能通过么…估计只有win平台这么写?
作者: roywillow    时间: 2010-4-12 12:42

额……我在BCB中新建一个控制台程序就会产生那样的主函数……
并且上来就是这些东西
引用:
//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
        return 0;
}
//---------------------------------------------------------------------------
谁知道BCB是个什么机制……
作者: liuyanghejerry    时间: 2010-4-12 18:01

这么一说我好像有印象了,记得 windows黑皮书里有说到这个…等放假回家看看…




欢迎光临 口袋社区-Poke The BBS (https://poketb.com/) Powered by Discuz! 6.1.0F