求解C语言程序题

long fib(int g)
{ switch(g)
{case 1:
case 2:return 1;}
return(fib(g-1)+fib(g-2);
}
main()
{ long k;
k=fib(5);
printf("k=%d\n",k);
}
求解以上程序的运行结果及分析思路,越详细越好,谢谢!

运行结果为5,在电脑上试过了。但是不知道怎么分析,递归调用自己的函数分析很复杂!
我尝试以这种思路来解释,不知道是不是对的,如果有错,请大家指正。
a:首先执行fib(5),不满足switch开关条件,直接return(fib(4)+fib(3));
b:先执行fib(4),把fib(3)压栈,由于fib(4)同样不满足switch开关条件,直接return(fib(3)+fib(2));
c:执行fib(3),把fib(2)压栈,由于fib(3)还不满足switch开关条件,直接return(fib(2)+fib(1));
d:执行fib(2),把fib(1)压栈,由于fib(2)满足case 2,所以return 1;然后fib(1)出栈,满足case 1,但是因为没有break语句,所以还要执行case 2,所以又return 1;
e:然后是上面的fib(2)出栈,满足case 2,所以return 1;
f:最后fib(3)出栈,不满足switch开关条件,直接return(fib(2)+fib(1));
g:执行fib(2),把fib(1)压栈,fib(2)满足case 2,所以return 1;
h:fib(1)出栈,满足case 1,但是因为没有break语句,所以还要执行case 2,所以又return 1;
所以加起来有5个return 1,所以结果k=5。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-03-16
核心就是;当case1符合时候。执行case1后便所有的语句(因为没有break)
就是当case1成立。case2也被执行了
第2个回答  2010-03-16
k=5!你从5开始分解下来!
从5分为4和3,再将4分为3和 2,3再分为2 1;以此推下去就行了!得出k=5!这是原代码
#include"stdio.h"
long fib(int g)
{ switch(g)
{case 1:
case 2:return 1;}
return(fib(g-1)+fib(g-2));
}
int main()
{ long k;
k=fib(5);
printf("k=%d\n",k);
return 0;
}
你用调试也可以知道它的运行原理

C语言程序分析题 大佬救救我?
分析:第一段程序使用for循环,每一次循环时,都对变量进行了初始赋值,即i=1,j=1,k=1。就是说,嵌套的内循环变量,如j,k都是从1开始的。而第二段程序使用while循环,循环开始时,没有对对变量进行了初始赋值,即j,k只有第一次循环时,初始值是1,当第二次循环时,最内层的k=5,内循环已经...

求解C语言程序输出题,如图,谢谢。
结果:a=-1 解析:本题目主要考了if-else语句,include<stdio.h> void main(){ int a=100, x=10, y=20, ok1=5, ok2=0;if(x<y) \/*10<20满足条件,执行下边的*\/ if(y!=10) \/*20不等于10,满足条件,继续执行*\/ if(!ok1) \/*对5取反,那么是0,那么不执行下边,而执行else*...

求解C语言基础题。
一、平台:数组中连续相等的元素就是一个平台。二、最长平台:就是在所有平台中找出最长的那个。三、方法不止一种,从完整程序思路,至少包含一个实现功能的函数及打印输出的函数。下面是我写的演示代码:遍历数组,找出最长平台,返回其在数组中起点和终点位置(返回值是指针数组)。异常直接抛出自行处理。

求解c语言问题
形式一:就是从1开始自增,自增次数是二维元素个数。形式二:[a,b],其中a表示行数,b表示列数。形式三:[a,b],其中a与行数有关,b与列数有关。在循环中a初值取(行数\/2)并自减,b初值取(列数\/2*-1)并自增。代码实现方式很多。这里题目指定要二维数组,但没有指定是什么类型的二维...

C语言题目求解决 要程序
代码如下:\/\/第一题#include <stdio.h>#define N 255void str_delete(char s[],char x){int i,j,len;i=0;while(s[i]!='\\0'){if(s[i] == x){for(j=i+1;s[j]!='\\0';j++)s[j-1]=s[j];s[j-1]='\\0';i=0;}elsei++;}}int main(){char str[N],ch;printf(...

求解c语言题:输入一个任意的三位数,将其各位数字反序输出(例如输入123...
代码如下:include <stdio.h> void main( ){int a,b,c,d;scanf("%d",&a);b= a\/100;c= (a%100) \/10;d=a%10;printf("%d",100*d+10*c+b);}

C语言题目求解
程序思路:先对总数组按年龄从大到小(相同年龄按登记号从小到大)排序。这样老年人部分就直接排序完成,并且在整个队列的前部。之后再对后半部分(非老人)按登记号从小到大再次排列。这样整个数组顺序便是题目想要的顺序。一、初始化函数(或者说是登记函数),定义结构数组,并用随机数填充数组。(...

c语言题目求解。
这个问题没有啥难度,首先,把程序的格式调整一下: if(a[i]){ if(first) first=0; else printf(" "); \/\/1 printf("%d",i); \/\/2}printf("\\n"); \/\/3 下面,这个就很好分析了,程序中共有3个printf语句: (1)对于1来说,只有程序走else分支,才会执行(2)对于2来说,只有a[i]...

c语言程序设计题:使用for语句实现求解10!的值
1.作为示例,以求解下面数学式为例:SUM = 1 - 3 + 5 - 7 + ...-99 + 101;首先,需要分析数学规律,就数学式中每一项的绝对值而言,可以看成 a(n) = 2 * n - 1 其中,n = {1,2,3...51},而就每一项的符号而言,可以发现,当 n 为偶数时,对应的项为负号;当 n 为奇数...

C语言程序运行题,求运行结果,这两道题的程序是怎么运行的,求解?
f(1): [x=1],x==0||x==1成立返回:3 f(3): y=x*x-3=3*3-3=6,返回: 6 z=6; printf输出:6 第4题:a=3,b=5, swap1(&a,&b): p指向a,q指向b,交换a和b的内容,a=5,b=3,返回 printf输出:a=5,b=3 swap2(a,b): 临时变量a=5,临时变量b=3,临时变量b=5,...

相似回答
大家正在搜