当前位置: 代码迷 >> C语言 >> 恶循环...
  详细解决方案

恶循环...

热度:210   发布时间:2006-03-06 11:22:00.0
恶循环...
fun(int n,int *s)
{
int f1,f2;
if(n==1||n==2) *s=1;
else
{
fun(n-1,&f1);
fun(n-2,&f2);
*s=f1+f2;
}
}
main()
{
int x;
fun(6,&x);
printf("%d\n",x);
}


.....结果是8,要分析过程.
----------------解决方案--------------------------------------------------------
这个程序求的是Fibonacci数列的,而程序求的是第六个数字,所以答案是8
求Fibonacci数列的另外一个用数组来处理的程序可能会对你的理解有点帮助:

main()
{
int i;
int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-1]+f[i-2];
for(i=0;i<20;i++)//求前20个Fibonacci数列
{
if(i%5==0)printf("\n");//每5个数换行
printf("%15d",f[i]);
}
printf("\n");
}
----------------解决方案--------------------------------------------------------
谢谢, 你写的哪个倒是容易理解多了...

就是不知如何理解我写的哪个....
----------------解决方案--------------------------------------------------------
以下是引用Fjcyz在2006-3-6 11:22:00的发言:
fun(int n,int *s)
{
int f1,f2;
if(n==1||n==2) *s=1;
else
{
fun(n-1,&f1); /*此处递归,又因为*s 与&x是同一地址*/
fun(n-2,&f2);
*s=f1+f2;
}
}
main()
{
int x;
fun(6,&x);
printf("%d\n",x);
}


.....结果是8,要分析过程.

还未想透


----------------解决方案--------------------------------------------------------

不过我觉得楼主你的程序有问题,
而且问题很多,是用法上的错误,但是算法挺好的


----------------解决方案--------------------------------------------------------

int fun(int n)
{
return((n==1||n==2)?1:fun(n-1)+fun(n-2));
}
void main()
{
printf("%d\n",fun(6));
getch();
}

这样一改好点


----------------解决方案--------------------------------------------------------
Fjcyz 你发的和6楼的思路是相同的,你写的只是把每次调用的返回值存在了第二个参数指向的变量中
----------------解决方案--------------------------------------------------------
feng1256你的程序看起来更结构化,而且容易理解
----------------解决方案--------------------------------------------------------
1256很8错,支持下

fun(n-1,&f1);
fun(n-2,&f2);
*s=f1+f2;

会产生这两个递归,下面的*s = ....,无论fun(n-1,&f1);还是fun(n-2,&f2);都好,它们都产生下一个fun(n-1,&f1)跟fun(n-2,&f2);这里是&跟*,所以最后一次n == 1 || n == 2,*s == 1,会改变f1或者f2的值。注意下是&跟*就不会难理解了。

----------------解决方案--------------------------------------------------------
  相关解决方案