关于c语言的一道题,求c高手帮忙解答~谢谢啦

#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(6,&x);printf("%d\n",x);
}
以上程序的输出结果是多少?最好带上解题的思路,谢谢各位啦

这个程序实际是在计算斐波那契数列:
1,1,2,3,5,8,13,21,……
算法:第1第2两项是1,以后每一项是前两项之和。
fun(int n, int* s)就是计算斐波那契数列第n项的值保存在地址为s的变量中。
所以fun(6,&x)是计算第6项的值(也就是8)保存在x中。
而fun(n-1,&f1)是计算第n-1项的值保存在f1中,fun(n-2,&f2)是计算第n-2项的值保存在f2中。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-05-09
8
这是递归调用函数!
函数返回值通过指针s返回!
6开始,函数返回值为
f(6,*)=f(5,*)+f(4,*)
f(5,*)=f(4,*)+f(3,*)
f(4,*)=f(3,*)+f(2,*)
f(3,*)=f(2,*)+f(1,*)
f(2,*)=1;这时候返回,不再继续
f(1,*)=1;这时候返回,不再继续

f(6,*)=5*f(2,*)+3*f(1,*)=5+3=8

错误之处://应为||
判断了==1,==2,如果刚开始n是0或负值那么函数永远不会返回类似于死循环!追问

{fun(n-1,&f1);fun(n-2,&f2);*s=f1+f2}是什么意思啊?麻烦帮忙解释下,谢谢啦

追答

配合前边if……else……
如果n不为1,2的时候,那么就有了
f1为fun(n-1,*)
f2为fun(n-2,*)
{
fun(n-1,&f1); //f1为指针,改函数的返回值为f1
fun(n-2,&f2); //f2为指针,改函数的返回值为f2
*s=f1+f2 //把两个值相加给前边的作为返回值,因为s可以作为返回值
}
以6为例,6!=1 且6!=2
fun(6,*)=fun(5,*)+fun(4,*) //*表示指针,这个值可以返回值!真正的函数没有返回值。
一直下去,直到n=1,或者n=2的时候,就不再递归调用函数fun了。

fun(2,*)=1
fun(1,*)=1
这是因为函数中给出的if(n==1 || n==2) *s=1;//s作为返回值

可以把fun(6,*)=fun(5,*)+fun(4,*) 中的fun(5,*),fun(4,*)继续拆!直到fun(2,*),fun(1,*)
就得到了f(6,*)=5*f(2,*)+3*f(1,*)=5+3=8

追问

fun(n-1,&f1)就是fun(n-1,&f1)?为什么啊?再帮下忙好么?谢谢啊

追答

你问的什么啊!
fun(n-1,&f1)
看到&号了没有!,函数的参数是指针类型!
在函数内部有*s=1是吧,说的就是把s指的内存内容换为1!
所以f1的内容就换成1,所以函数fun(1,&f1);执行后,f1的值就变了!(这是当n=1,2时)
当其他情况也类似!只不过函数值是该函数的递归调用!
好好理解一下指针形参吧!

本回答被提问者和网友采纳
第2个回答  2011-08-28
您好,
看C程序。首先看主函数,我们一步步来开:
1,定义整形变量x,,以x的地址为参数。调用函数fun ,我们就带着x来看fun
2,再fun函数内 fun(int n,int *s),,,当我们调用的时候,这个时候n=6,s是x的地址。
3,运行fun函数,首先这个if不执行。执行else,即fun(5,&f1)...
就这样一步步运行。。谢谢!

一道c语言问题,请各位高手们帮帮忙,谢谢
char p[][20]={“get”,”put”,”out”};p是一个有3个元素的数组,数组中的每个元素都是一个char[20]类型的数组。也就是说,p是一个二维数组。strlen(p[0])+strlen(p[1])+ strlen(p[2])即计算p中的三个字符串的长度总和,为3+3+3=9。

C语言高手,帮帮忙
然后在执行i=st%i,因为初值i=10,经过执行第一句后st=75,所以i=75%10 ,所以是5 (8) !(非) &&(且) ||(或)(9) 1,2,3 因为if的条件是a>c,那么要当a>c成立的时候,才执行后面的语句,但是初值给出了a=1,c=3,所以,不执行后面的语句,所以还是现实原来的值 (10)x=0;...

c语言编程题,请高手帮忙做一下,拜谢,急急急急……
int count;for (count = 1; count <= 4*n-1; count+=4){ back += (double)1\/count;} for (count = 3; count <= 4*n-1; count+=4){ back -= (double)1\/count;} return 4*back;} 2.include <stdio.h> define LEN 3 define N 30 \/\/ \/\/ 结构定义 \/\/ typedef struct st...

一个奇怪的C语言问题,涉及到指针、数组、堆栈、以及printf,希望C语言大...
数组空间也被释放),printf占用了栈,所以,把原来函数f的栈空间内容修改了。所以,第一条printf语句是可以得到结果的。后面因为arr空间的内容已经被修改,所以,之后的printf语句都得不到结果。顺便再解释一下printf("%s\\n",p);得到的为什么是乱码。正如上面所说,先计算参数p的值保存栈顶。保存的值...

请各位C语言高手帮忙解决下面的问题。
int binary_find(int * a, int target, int low, int high){ if (low > high){ return -1;} else if (a[(low + high)\/2] == target){ return (low + high)\/2;} else if (a[(low + high)\/2] > target){ return binary_find(a, target, low, (low + high)\/2 - 1)...

一个有关C语言(数据结构)程序设计题 高手请帮忙,高分!
int Locate(MGraph G,char c){ for(int i=0;i<G.vexnum;i++)if(G.vexs[i]==c) return i;return -1;} \/\/创建无向网 void CreateUDN(MGraph &G){ int i,j,w,s1,s2;char a,b,temp;printf("输入顶点数和弧数:");scanf("%d%d",&G.vexnum,&G.arcnum);temp=getchar(); \/\/...

一个关于c语言中输入的问题,求高手帮忙!
换成如下代码就行了:include<stdio.h> define N 20 void main( ){ int n,k,i,j,ik;double m,t,max,a[N][N],b[N];printf("输入阶数n:\\n");scanf("%d",&n);printf("\\n输入二维数组a:\\n");for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%lf",&a[i][j]);printf("...

C语言编程求助!!!求高手帮忙!感激不尽!
include "stdio.h"include"string.h"int main(){ int i,s = 0; \/*请修改此处:int和i间有空格; 计算的和值s首先要清零 *\/ char str[80];i=0;while ((str[i]=getchar())!='\\n')i++;str[i]='\\0';for(i=0;i<80;i++)if (str[i]>='0' && str[i]<='9') \/*...

请高手用C语言帮忙做个编程的题目,谢谢了!
int IsDevided(int number,int dev){ if(number %dev == 0){ return 1;} return 0;} void EasyDone(int a){ int chose;int i,j;printf("Input your chose\\n1>能被3整除的"<Enter 1>","\\n2>能被5整除的<Enter 2>","\\n3>能被3或5整除的<Enter 3>\\n");scanf("%d",&chose)...

一道C语言编程问题,高手们来看看帮忙解答下
int c;int sum;\/\/ABC之和。for (a = 100;a > 0;a--)\/\/以A为循环变量,在1到100之间。{ for (b = a-1;b > 0;b--)\/\/以B为循环变量,在1到A之间。{ for (c = b-1;c > 0;c--)\/\/以C为循环变量,在1到B之间。{ \/\/判断公式左右两侧是不是相等,相等侧符合题目要求 if...

相似回答