C语言中遇到的程序问题

请写出下面程序的运行结果
long fun(int k)
{
long fac;
if(k==0)
return 1;
else
{
fac=k*fun(k-1);
printf("fac=%1d\n",fac);
}
return fac;
}
void main(void)
{
int n=3;
printf("result=%1d\n",fun(n+1)/n)
}
答案是
fac=1
fac=2
fac=6
fac=24
result=8,请帮我解答,过程要详细哦。。

这是个简单的递归算法。fac=k*fun(k-1);就是这个算法的核心所在,我们先将此称为“核心代码”。当k为4(因为n=3,而main中为fun(n+1),所以为k为4,事实上不能那么单纯理解这里,但是也无需深究,你只要知道fun这个函数的实参为4就可以了。)。
因为有这段的存在
if(k==0)
return 1;
else
{
fac=k*fun(k-1);
printf("fac=%1d\n",fac);
}
所以你可以知道直到K为0为止,该程序都在实行一个重复的镶套的过程,简单点看就是
fac=k*fun0(fun1(fun2(fun3(fun4(0)))))
以上这句话里的0、1、2、3、4只是代表这个镶套的重复次位置,4代表最后的那个k的值为0的fun函数。
先看fun4,因为k为0所以fun4返回的值为1,然后因为fun4已经得到返回值为1所以镶套中的fun4跳出到fun3,核心代码变为fun3:fac=1*fun4(1-1),已知k为1所以才能有fun4(0),的fun4=1所以fun3:fac=1*1,fac的值为1,然后fun3中的
fac=k*fun(k-1); 1
printf("fac=%1d\n",fac); 2
既然第一句已经执行完毕得到fac为1,那么轮到执行第二句,输出的当然为1,所以第一个fac=1.
根据程序fun3的返回值为1.程序跳出镶套中的fun3到fun2,跟上面的过程一致,fun2的核心代码就变为
fac=k*fun3(k-1)已知k为2,因为只有K为2才能得到fun3中的k为1,而fun3的返回值是1,所以这里的代码就为
fac=2*1,然后fac的值为2
然后跟上面一样,执行了一次fun2中的printf,得出第二个输出fac=2,fun2返回2给fun1.
剩下的就是重复以上这个过程了,fun1中的核心代码变为fac=K*fun2(k-1),fac=3*2=6.然后第三个输出为6.fun1返回6给fun0.
再接下来就是跳出fun1到fun 0,fun0的核心代码为fac=k*fun1(k-1).fun1的返回值为6所以
fac=4*6=24,所以第四个输出为24.fun0为镶套的第一层,所以第一层结束就完成了函数fun的递归过程。程序来到最后的
printf("result=%1d\n",fun(n+1)/n);这句处。
最后的fun(4)等于24.所以fun(n+1)/n就为24除以3等于8.所以result为8。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-30
这是求n!
fac=1!
fac=2!
fac=3!
fac=4!
。。。
result=(n+1)!/n

为什么C语言中有的程序没有报错就执行不了?
1. 程序陷入死循环:程序在某个地方出现了死循环,使得程序无法继续向下执行。如果程序似乎无法结束,可以检查程序是否存在死循环。2. 内存泄露:程序在使用动态内存分配函数(如malloc、calloc)等开辟内存空间时,没有及时释放所分配的内存空间,导致内存泄露。内存泄露会导致系统内存资源的浪费,最终导致程序...

c语言程序 哪里出错了呢 始终运行不出结果
在C语言编程中,若程序始终无法输出结果,可能是因为输入数据的类型与程序调用的数据类型不一致。以scanf函数为例,当使用 scanf("%lf%lf%lf",&a,&b,&c);进行输入时,确实将输入的数字以float类型存储至内存中。然而,程序在读取这些内存时,可能期望以double类型进行解析。这种类型不匹配会导致解析出...

为什么c语言程序在运行时出现错误?
出现这个报错的原因是:代码输入过程中出现全角输入,将代码中括号、分号等用半角字符替换即可。根据题目给出的提示,请检查一下第51行代码,将51行代码中出现的全角符号替换成半角字符,或者输了重新输入就行。

在C语言中运行程序时最常出现的有那些错误?
一、基础知识和数据类型、表达式 1、{},[],(),‘’,“”不配对。解决这个问题最好的方法就是每当写这些符号的时候就先写成一对,然后再在中间加内容。 2、忘记在语句的末尾加分号,或在预处理命令后多加分号。记住:每一个语句的后边都要加分号,而预处理命令并不是语句,所以不加分号...

经验分享:C语言初学者常见的 10个错误!
多打分号也是一种常见的错误。复合语句后不应再加分号,否则会导致程序执行效率降低,无意义的分号会增加程序的复杂性。例如,在if语句后加分号,会使程序逻辑混乱,导致程序永远执行i++,不论a是否等于0。变量命名的错误也是初学者常犯的问题。在C语言中,变量命名不能以数字开头,不能包含运算符,也...

在C语言中,计算机程序通常有哪几种错误?
1、系统错误:这是指程序没有语法错误和逻辑错误,但程序的正常运行依赖于某些外部条件的存在,如果这些外部条件缺失,则程序将不能运行。2、语法错误:这是指程序中含有不符合语法规定的语句,例如关键字或符号书写错误(将printf写成print、将数组元素引用写成a(2)等)、使用了未定义的变量、括号不配对...

C语言中遇到的问题:程序原意是如果输入的是y则跳出while循环,否则一直...
你问题都问错了,应该是输入的是y则一直循环,给你改好程序了 include<stdio.h> void main(){ char ch;do { float r;printf("请输入圆的半径r=");scanf("%f",&r);printf("圆的周长为:%f\\n",2*3.1415*r);printf("是否继续? y\/是 n\/否 ");fflush(stdin);ch=getchar();prin...

C语言计算税收,程序有问题,下面是代码,scanf提示错误。
在C语言中,编写计算税收的程序时,可能会遇到诸如"scanf"提示错误的问题。为了确保程序的正确运行,理解并正确使用语法至关重要。这里有一个关于税收计算的代码示例,其中涉及到表达式的书写错误。原代码中,有如下表达式:`elseif(1000>x>=5000)`。这个表达式的写法在C语言中是不正确的。正确的形式应为...

为什么C语言编写的程序运行时闪一下就没了?
当C语言编写的程序运行时突然消失,通常源于设置上的问题。要解决这个问题,可以参考以下步骤:首先,从最基础的HELLO WORLD程序开始。当你编写并编译完成这个程序后,正常运行时,程序会在屏幕上显示“Hello World”,只有在用户按下任意键后才会关闭窗口。然而,当你直接双击执行生成的EXE文件时,可能会...

c语言程序设计中出现too many initializers,怎么解决
在C语言程序设计中,遇到"too many initializers"错误通常意味着初始化列表中的初始化项过多。要解决这个问题,首先打开你的C语言编译器,例如Visual Studio、GCC或Clang等。以下是详细的步骤:1、启动编译器后,打开你的C源代码文件。2、在编译步骤中,通常有一个"编译"或"构建"选项,点击它开始处理...

相似回答
大家正在搜