庚午 发表于 2015-3-11 22:56:49

求帮忙分析一下这个f1和f2的值谢谢

#include<stdio.h>
int 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(8,&x);
printf("%d\n",x);
}

庚午 发表于 2015-3-12 20:39:39

谁在啊!!!!居然没回复!!!!

haiouda 发表于 2015-3-12 22:09:05

#include<stdio.h>
int 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;
}
return *s;
}
main()
{
int x,i;
i=fun(8,&x);
printf("%d\n",i);
}

把你的程序小改了一下;也不知道改得对不对;
f1 和f2 的值,是用递归求出来的,

秀丽江山 发表于 2015-3-12 22:51:49

看不懂,你这是在求fibonacci数列吗?我刚学到指针,还看不懂
不过你的函数好像没有返回值啊?为毛是个int?
我写了一个,但是觉得fun(x , &y);这个地址感觉没用啊,多此一举。
#include<stdio.h>
int fun(int a,int*b);
void main()
{
        int m=0,n=0;
        int *x=&m;
        puts("请输入要求的第几个数列");
        scanf("%d",&n);
        m=fun(n,&x);
        printf("结果为 %d",*x);
}

int fun(int a,int*b)
{
        if(a==1||a==2)        return 1;
        int i=fun(a-1,&b)+fun(a-2,&b);
        int* num=&i;
        return *num;
}

秀丽江山 发表于 2015-3-12 23:11:23

如果你想返回的是一个指针,就应该int*fun (int a);吧
我写了一个返回指针的,感觉这玩意真难。
给我指正一下:
#include<stdio.h>
int i=0;      //全局变量,许多指针都指向这个变量。
int fun2(int a)    //真正运算fibonacci数列的函数
{
        if(a==1||a==2) return 1;
        return fun2(a-1)+fun2(a-2);
}
int* fun(int a)    //返回指针的函数
{
        int* num=&i;
        i=fun2(a);
        return num;
}

void main()
{
        int n;
        int *x;
        puts("请输入要求的第几个数列");
        scanf("%d",&n);
        x=fun(n);      //经过两次指向,x还是指向i的
        printf("结果为 %d",*x);
}

庚午 发表于 2015-3-13 19:59:56

haiouda 发表于 2015-3-12 22:09
把你的程序小改了一下;也不知道改得对不对;
f1 和f2 的值,是用递归求出来的,

这样输出了斐波那契数列。我想要最后返回的值!为什么会是21 !!!!

庚午 发表于 2015-3-13 20:00:34

秀丽江山 发表于 2015-3-12 22:51
看不懂,你这是在求fibonacci数列吗?我刚学到指针,还看不懂
不过你的函数好像没有返回值啊?为毛是个int ...

想分析f1 和f2值的切换 以及递增啊!!!!

仰望天上的光 发表于 2015-3-14 11:07:11

int fun(int n,int *s)是将fibonacci数列的第n项填入*s中,
if(n==1 || n==2)
*s =1;
这个是递归的结束条件
fun(n-1,&f1);
fun(n-2,&f2);
*s=f1+f2
这个是递归的一般情况。

顺便说下,课堂上分析循环或者递归的执行过程,仅仅是出于好奇心验证这种编程方式的正确性,绝对不是叫你每次遇到循环或递归都要做这种分析。事实上,你可以看看之前循环或递归的编程方式,从中得到“不变式”(对于循环)和“递归方程”(对于递归),剩下的就是毫无创造性编写代码了。
如果上面有什么名词看不懂,可以baidu

haiouda 发表于 2015-3-14 12:29:40

庚午 发表于 2015-3-13 20:00
想分析f1 和f2值的切换 以及递增啊!!!!

可以在VC6.0里,一步一步地执行,这样就可以看到,全部过程了

庚午 发表于 2015-3-14 18:43:41

haiouda 发表于 2015-3-14 12:29
可以在VC6.0里,一步一步地执行,这样就可以看到,全部过程了

做过单步调试,才混乱了! 能简单的解释一下不!!

haiouda 发表于 2015-3-15 13:43:20

本帖最后由 haiouda 于 2015-3-15 13:45 编辑

庚午 发表于 2015-3-14 18:43
做过单步调试,才混乱了! 能简单的解释一下不!!
上面的太复杂,你弄个简单的;比如把 f2去掉(没试下面的程序有没有错误,你试着去掉f2),再一步一步调试,理解了f1的变化,上面的就好弄懂了;

#include<stdio.h>
int fun(int n,int *s)
{
int f1;
if(n==1 || n==2)
   *s =1;
else
{
   fun(n-1,&f1);
   
   *s=f1+0;
}
return *s;
}
main()
{
int x,i;
i=fun(8,&x);
printf("%d\n",i);
}
页: [1]
查看完整版本: 求帮忙分析一下这个f1和f2的值谢谢