请问:不用递归 怎么实现F(X)=F(X-1)+F(X-2)呢?
请问不用递归怎么实现F(X)=F(X-1)+F(X-2)呢? 问题点数:10、回复次数:25Top
1 楼missdeer(思鹿)回复于 2005-03-04 09:43:10 得分 0
菲波那切数列?
int x1=1,x2=1;
for(int i=0; i< N; i++)
{
x1=x1+x2;//奇数项,第3,5,7,9...项
x2=x1+x2;//偶数项,第4,6,8,10...项
}Top
2 楼yiminggw(某某鸟人)回复于 2005-03-04 09:44:25 得分 0
递归和循环可以互转
Top
3 楼yc0188(守护瓶(萍))回复于 2005-03-04 09:57:16 得分 0
请问不用递归怎么实现F(X)=F(X-1)+F(X-2)呢?
int Fibonacci(int n)
{
int p, l, t, l;
if(n == 1)
return 0;
elseif( n == 2)
return 1;
else
{
l = 0;
t = 0;
for(i = 3; i <= n; i++)
{
p = l;
l = t;
t = p + l;
}
return t;
}
}
Top
4 楼yc0188(守护瓶(萍))回复于 2005-03-04 09:58:21 得分 0
这个是程序设计方法学里的算法!
多去看看书吧!Top
5 楼lianxiangpanjin(联想)回复于 2005-03-04 09:59:10 得分 0
to missdeer(思鹿) :
for() 中间的那段什么意思能解释下吗?
我们老师说可以通过设变量 实现不用递归求出,那种方法有人会吗?Top
6 楼jialuo(jialuo)回复于 2005-03-04 10:02:07 得分 10
int f(int n)
{
if(n>2)
{
int f1=1,f2=1,f3;
for(int i=3;i<=n;i++)
{
f3=f2+f1;
f1=f2;
f2=f3;
}
return f3;
}
else
return 1;
}Top
7 楼lianxiangpanjin(联想)回复于 2005-03-04 10:11:58 得分 0
to yc0188(我好堕落) 好办法,
请问大家还有别的方法吗?Top
8 楼changyanshuo(尘埃)回复于 2005-03-04 10:14:41 得分 0
很多人都已经正解
如果不用递归,就用递推了
Top
9 楼missdeer(思鹿)回复于 2005-03-04 10:17:19 得分 0
to missdeer(思鹿) :
for() 中间的那段什么意思能解释下吗?
我们老师说可以通过设变量 实现不用递归求出,那种方法有人会吗?
====================================
循环里:
x1=x1+x2; 这样x1就是第3项了(第1项+第2项)
然后x2=x1+x2;这样x2就是第4项了(第3项+第2项)
…………Top
10 楼pcboyxhy(-273.15℃)回复于 2005-03-04 12:05:14 得分 0
1.这个数列存在非递归的通项公式,
貌似 (1+sqrt(5))^n/2+(-1+sqrt(5))^n/2,也许记错了。
2.迭代。
#include<iostream.h>
#include<string.h>
const int maxlenx=7000;
int main( int argc, char * argv[] )
{
char num[2][maxlenx];
int g,i,n,m,a=0,b,j;
memset(num, 0, 2*maxlenx);
cin>>n; cout<<endl;
m=2;num[0][0]=1;num[1][0]=1;
for(i=2; i<n; i++)
{
a=i%2; b=(a+1)%2; g=0;
for(j=0; j<m; j++)
{
num[a][j]=num[a][j]+num[b][j]+g;
g=num[a][j]/10;
num[a][j]%=10;
}
if(num[a][j-1]) m++;
}
for(i=m-2; i>=0; i--)
cout<<int(num[a][i]);
return 0;
}
这段代码可以计算位数<7000的值.Top
11 楼sky911911(assda)回复于 2005-03-04 13:35:37 得分 0
int Fibonacci(int n)
{
int p, l, t, l;
if(n == 1)
return 0;
elseif( n == 2)
return 1;
else
{
l = 0;
t = 0;
for(i = 3; i <= n; i++)
{
p = l;
l = t;
t = p + l;
}
return t;
}
}
谁帮解释一下 不是很明白 怎么两个l ???Top
12 楼gtownsin(唐僧)回复于 2005-03-04 13:37:34 得分 0
yc0188(我好堕落) 的程序逻辑是有点不对如果顺序改成(t = p + l;p = l;l = t;)就对了,jialuo(jialuo) 的逻辑基本正确
Top
13 楼gtownsin(唐僧)回复于 2005-03-04 13:41:34 得分 0
-〉sky911911(assda) 谁帮解释一下 不是很明白 怎么两个l ???
可能是笔误
Top
14 楼bouluo505(bouluo)回复于 2005-03-04 14:46:42 得分 0
这是个一般的解法,以前做的,没改进过,发上来大家讨论讨论!
#include <stdio.h>
#define N 100
int f[N];
int fibonaci(int k,int m)
{
for(int i=0;i<k-1;++i)
f[i]=0;
f[k-1]=1;
if(m>=1&&m<=k-1) return 0;
if(m==k) return 1;
else{
for(int j=k;j<=N;j++)
{
f[j]=0;
for(int t=j-1;t>=j-k;t--)
f[j]+=f[t];
if(j==m-1)
return f[j];
}
return -1;
}
}
void main(){
int k,m;
printf("INPUT:");
scanf("%d %d",&k,&m);
f[m]=fibonaci(k,m);
if(f[m]<0)
printf("Cann't solve it!\n");
else
printf("\n%d\n",f[m]);
}
Top
15 楼bouluo505(bouluo)回复于 2005-03-04 14:51:13 得分 0
可以稍改一下数组就可以计算更大的数,还有就是改一 下头文件和有关函数以更能说明是用C++编的!上面的程序是在VC6.0用编译的!!Top
16 楼w626872(科本)回复于 2005-03-04 15:16:13 得分 0
给诸位热爱C语言的朋友奉贤上一个群 C/C++专用群 10068879 注名csdn
希望大家在一起努力,一起学习~互助
Top
17 楼leoliuhpo(流风的人)回复于 2005-03-05 03:40:58 得分 0
其实程序员的书上有这个题,用Stack实现的.Top
18 楼pcboyxhy(-273.15℃)回复于 2005-03-05 09:15:58 得分 0
用Stack实现?
这么烂Top
19 楼baryjim(吃饭-睡觉-打豆豆)回复于 2005-03-05 09:35:33 得分 0
用stack效率太低了!!
用有限个单元就可以进行处理!Top
20 楼iwlla(iwlla)回复于 2005-03-05 17:05:14 得分 0
用一个数组应该可以的吧?
for (i=2;i<N;i++) /*N自己定义大小*/
F(i)=F(i-1)+F(i-2);
不过这样浪费内存空间,但可以得到每一项的值.
int f(int n)
{
if(n>2)
{
int f1=1,f2=1,f3;
for(int i=3;i<=n;i++)
{
f3=f2+f1;
f1=f2;
f2=f3;
}
return f3;
}
else
return 1;
}
这个得到的是最后一个值.但节约内存空间,具体用哪个要根据具体情况来定Top
21 楼iwlla(iwlla)回复于 2005-03-05 17:06:51 得分 0
用一个数组应该可以的吧?
for (i=2;i<N;i++) /*N自己定义大小*/
F[i]=F[i-1]+F[i-2];
不过这样浪费内存空间,但可以得到每一项的值.
int f(int n)
{
if(n>2)
{
int f1=1,f2=1,f3;
for(int i=3;i<=n;i++)
{
f3=f2+f1;
f1=f2;
f2=f3;
}
return f3;
}
else
return 1;
}
这个得到的是最后一个值.但节约内存空间,具体用哪个要根据具体情况来定
Top
22 楼greenery(greenery)回复于 2005-03-05 22:51:06 得分 0
没写过,过去试试看先。Top
23 楼tsocpp(小黑子)回复于 2005-03-06 00:51:33 得分 0
这道题很简单啊,不用递归就用迭代的方法啊,很多的写对了啊
拿 yc0188(我好堕落) 的程序作个注释吧,希望你不会介意,
int Fibonacci(int n)
{
int p, l, t, l; //多打了一个l吧???
if(n == 1) //这里是数字1不是字母l,虽然它们长的很象
return 0;
elseif( n == 2)
return 1;
else
{
l = 0;
t = 0; //好象应该对t赋初值为数1吧?不然F(3)就=0了,但F(2)已经是1了
for(i = 3; i <= n; i++)
{
p = l;// gtownsin(唐僧) 认为他循环体内的逻辑有问题,应该
l = t;//改成(t = p + l;p = l;l = t;),我觉得两个都是可以的,而且是一样的
t = p + l;//而且他的似乎更好,因为在跳出循环前再对其进行
} //p=l;l=t; 置换,显得点多余
return t;
}
}
以上纯是个人意见,有不同看法的可以提出来讨论!
Top
24 楼junmayang(笨猪)回复于 2005-03-06 15:05:35 得分 0
用栈!不过有点杀鸡用牛刀了Top
25 楼gtownsin(唐僧)回复于 2005-03-07 08:54:12 得分 0
--->>>tsocpp(小黑子)
你说得不错,我当时没有仔细考虑!Top




