对手相逢时,无
论对手多么强大,
明知不敌,也要亮出自己的剑!
读者:斐波拉契数列递归实现的方法如下:
int Funct( int n )
{
if(n==0) return 1;
if(n==1) return 1;
retrurn Funct(n-1) + Funct(n-2);
}
请问,如何不使用递归,来实现上述函数?
小林:
int Funct( int n ) // n 为非负整数
{
int a=0;
int b=1;
int c;
if(n==0) c=1;
else if(n==1) c=1;
else for(int i=2;i<=n;i++) //应该n从2开始算起
{
c=a+b;
a=b;
b=c;
}
return c;
}
解释:现在大多数系统都是将低字位放在前面,而结构体中位域的申明一般是先声明高位。
100 的二进制是 001 100 100
低位在前 高位在后
001----s3
100----s2
100----s1
所以结果应该是 1
如果先申明的在低位则:
001----s1
100----s2
100----s3
结果是 4
题目跟位域的存储空间分配有关,到底是从低字节分配还是从高字节分配,从D ev C++和V C7.1上看,都是从低字节开始分配,并且连续分配,中间不空,不像谭的书那样会留空位。
题目跟编译器有关,编译器在未用堆栈空间的默认值分配上有所不同,Dev C++未用空间分配为01110111b,V C7.1下为11001100b,所以在D ev C++下的结果为5,在V C7.1下为1。
注:PC一般采用little-endian,即高高低低,但在网络传输上,一般采用big-endian,即高低低高,所以可能考虑big-endian模式,这样输出结果可能为4。
有时候,正是那些意想不到之人,成就了无人能成之事。——图灵