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

#include<stdio.h>intfun(intn,int*s){intf1,f2;if(n==1//n==2)*s=1;else{fun(n-1,&f1);fun... #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);
}
以上程序的输出结果是多少?最好带上解题的思路,谢谢各位啦
展开
 我来答
陈宗权8d804
2011-08-28 · TA获得超过3766个赞
知道小有建树答主
回答量:1159
采纳率:0%
帮助的人:958万
展开全部
这个程序实际是在计算斐波那契数列:
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中。
踽踽独行Jerry
推荐于2018-05-09 · TA获得超过169个赞
知道小有建树答主
回答量:136
采纳率:0%
帮助的人:102万
展开全部
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
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhang862413
2011-08-28 · TA获得超过101个赞
知道答主
回答量:38
采纳率:0%
帮助的人:29.8万
展开全部
您好,
看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)...
就这样一步步运行。。谢谢!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式