c语言递归函数题,大神给我解释一下

2020-12-11 21:08:06 字数 5361 阅读 6596

1楼:匿名用户

阶乘函数

=f(10)

=10*f(9)

=10*9*f(8)

.........

=10*9*8*7*.....f(1)=10*9*8*7*.....1*f(0)//0<1不符合ifreturn1结束

给我解释一下c语言递归函数?

2楼:匿名用户

递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法的特点

递归过程一般通过函数或子过程来实现。

递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。

递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

递归算法所体现的“重复”一般有三个要求:

一是每次调用在规模上都有所缩小(通常是减半);

二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);

三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。 例子如下:

描述:把一个整数按n(2<=n<=20)进制表示出来,并保存在给定字符串中。比如121用二进制表示得到结果为:“1111001”。

参数说明:s: 保存转换后得到的结果。

n: 待转换的整数。

b: n进制(2<=n<=20)

void

numbconv(char *s, int n, int b)

/* figure out first n-1 digits */

numbconv(s, n/b, b);

/* add last digit */

len = strlen(s);

s[len] = "0123456789abcdefghijklmnopqrstuvwxyz"[n%b];

s[len+1] = '\0';

}void

main(void)

exit(0);}

3楼:匿名用户

额,抽象的说就是解决一个问题时重复使用一个动作,那么就可以用递归的方式来解决,告诉电脑重复做这个动作就行.结合看一些递归算法的简单程序,应该好懂些.

4楼:申冰洁隐祺

分析一下fac()是如何执行的。假设读入的n=3。

首先,main()函数中的y=fac(3),引起第1次函数调用。进入函数后实参n=3,应执行计算3*fac(2)

为了计算fac(2),引起对fac()函数的第2次调用(递归调用),重新进入函数fac(),实参n=2,应执行计算2*fac(1)。

为了计算fac(1),引起对函数fac()的第3次调用(递归调用),重新进入函数,实参n=1,应执行计算1*fac(0)。

为了计算叫fac(0),引起对函数fac()的第4次调用(递归调用),重新进入函数,实参n=0,此时执行f=1和return(f),完成第4次调用,回送结果fac(0)=1,返回到第3次调用层。

计算执行f=1*fac(0)和return(f),完成第3次调用,回送结果fac(1)=1

返回到第2次调用层。

计算执行f=2*fac(1)和return(f)。完成第2次调用,回送结果fac(2)=2,返回到第1次调用层。

计算执行f=3*fac(2)和return(f).完成第1次调用,回送结果fac(3)=6,返回到土函数。

5楼:匿名用户

先看看下面的例子:

void fun(int i)

printf("%d\n",i);

}intmain()

后如下:好理解

了吧void fun(int i)

printf("%d\n",i/4);

}printf("%d\n",i/2);

}printf("%d\n",i);

}这样一展开,是不是清晰多了

c语言递归函数谁能帮我解释一下,程序如下

6楼:匿名用户

a为入口参数,及相当于子函数当中的n,a为1的时候,返回值为1;

否则就是为上一次的结果×a×(a-1);//这里的a为循环函数中的新一轮的a的值

c语言编程问题,请求大神帮我解释两个步骤 运用了递归,但是两个子函数我没看懂,不知道为什么这样做

7楼:匿名用户

对于(1),也就是函数xh。

这个问题是在1到n的n个数中,取一些数出来,使得它们的和为m。

对于这个问题,有一些特殊情况:那就是a,b

a. 如果m=1,则只有一种情况,那就只用一种情况,只能取一个数,这个数就是1。

b. 如果不满足a,且 n<=1 或者m<=0, 那么将没有解,也就是有0种情况。

c. 如果不满足a和b,那么又可以分成两种情况(这是递归的关键之处),i.如果取最后一个数,且n就等于m,那就这一种情况也就是 t=1,若n=m,那么就只有取m这个数一种情况。

在接下来的就分成两种:i.不取最后一个数,则需要在前面n-1个数中取c个数,它们的和是m,也就是 zxh(n-1,m,c);ii.

要去最后一个数, 则 需要在前面n-1个数中取c-1个数,它们的和是m-n,也就是zxh(n-1,m-n,c-1)了。

需要好好仔细理解,祝你早点想透

求c语言大神详解递归函数,求详细解释,本人脑子笨,所以恳请步骤越详细越好

8楼:匿名用户

递归函数

就是bai自己du

调用自己

但是函数里面必须zhi得有一个不dao调用自己的分支,不回然就死循环了答

,会导致栈溢出。

最简单的就是这样

intf(intn)

9楼:匿名用户

递归就是自己调用自己啊。

void exp()

这样就会无限输出hello

c语言递归难住我了 大神解答分析一下 写个简单**

10楼:东油瑞祥

递归其实就是循环调用函数自身,这是书上的例子和解释,不知道你能不能看懂

c语言的问题,不太理解这个函数,大神给解释一下

11楼:自我编程

fgets函数原型

char *fgets(char *buf, int bufsize, file *stream);

参数*buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明存储数据的大小。

*stream: 文件结构体指针,将要读取的文件流。

含义:从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。

如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以null字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回buf,失败或读到文件结尾返回null。

下面我对你这个**补充说明:

stdin是c语言中标准输入流,一般用于获取键盘输入所以** ret_val = fgets(st, n, stdin); 这里意思:

从键盘读入n位字符+结束'\0’存放到st数组中。

而判断if (ret_val)

输入9个字符。打印前5个。

输入4个字符。打印全部。

12楼:

char*s_gets(char*st,intn)

returnret_val;//返回}

13楼:匿名用户

大致意思是一次从stdin读取一行,最多n个字符, 如果n个里面包含回车,截取回车前面的

如果不包含回车,一致读直到读到回车

14楼:匿名用户

返回一个指向字符串的指针

求真正理解汉诺塔问题的电脑大神给我解答一下,当n=3时,求用c语言编写的汉诺塔递归调用**的详细执

15楼:匿名用户

问题:求真正理解汉诺塔问题的电脑大神给我解答一下,当n=3时,求用c语言编写的汉诺塔递归调用**的详细执

回答:散分吧

什么是汉诺塔问题

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片**圆盘。

大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

如何理解汉诺塔问题

c语言递归调用,不太懂,请大神帮忙解释一下,万分感谢!

16楼:匿名用户

用普通语音的方式解释一下程序运行的顺序和规则:

首先定义了一个字符串指针数组,最后一个指向的字符串是"end"

主函数调用displaynames显示这个数组指向的所有字符串(不包括最后的那个end)

displaynames函数:

判断当前提供的字符串指针指向的字符串是否“end”,如果是,直接返回,什么也不做;

否则用当前字符串指针的下一位置指针调用另一个displaynames函数,等它返回后将当前不等于end的字符串printf出来并等待键盘输入一个字符后返**用者

结果就是,会倒序输出所有字符串,最终返回主函数并结束运行

这里会调用多个displaynames函数,每个函数调用时调用者不同,但处理相同而已。你可以简单理解为,调用基础displaynames你就写几遍displaynames函数,第1次取名并调用的是displaynames1,...,第n次调用的是displaynamesn,每个函数的运行除返回值以外(displaynames没有返回值)不互相影响

求C语言大神,帮忙解释一下这道题的选项,刚入门C语言

1楼 匿名用户 a选项2的二进制是010,5的二进制是101,所以2与5的结果是0,即条件为假,所以不能形成死循环 bwhile中是逗号表达式,取最后一个表达式3的值为真,所以是死循环 cd中 0 是字符的ascii值为0的转义字符,所以为假,不构成死循环条件 2楼 天云一号 a2 5 0 所以不会...

谁能解释一下这个程序C,谁能帮忙详细解释一下这个C语言程序~~要详细的哦~

1楼 匿名用户 p int malloc sizeof int 申请一段大小为sizeof int 的空间 并把该段空间的起始地址赋值给p fut int s int p 2 3 参数s定义为类型int 即指向指针类型的指针 或者叫二级指针用 s就是对其元素进行赋值 2楼 帅的都想毁容 p int ...

c语言算法问题解释一下圈出的地方

1楼 祜风 第一句 读入输入数据temp 第二句 统计temp输入的个数,b temp 记录的是temp的个数,每多一个,就自加一次 第三句 记录出现次数最多的temp的次数 2楼 听不清啊 读入一个整数,再给该数的计数加1。如计数比最多的数还多,就更新最多数。 c语言 3个人围成一圈报数问题,报道...