这是一个关于C语言递归的相关问题

递归的应用场景是什么呢?
是不是所有的程序都能转换成递归形式的呢?
递归 只能用在函数内部? return 后面加递归操作行吗

3个回答

递归主要运用的场景是解决问题的一部分和问题的整体有相似的结构的算法,比如说遍历树、文件系统、在棋类算法中遍历各种走法
快速排序算法也可以使用递归,将数据一分为二,小的放在左边,大的放在右边,再分别对左右两部分运用相同的方法,直到不能再分,就是递归算法。这种算法思想也叫做分治。
在数学上,数学归纳法和递归是可以联系在一起的,比如说斐波拉契数列,用数学归纳法定义就是
f(1)=1 f(2)=1 f(n)=f(n-2)+f(n-1)当n>2的时候,用递归来写就是
int f(int n)
{
if (n<=2) return 1;
return f(n-2)+f(n-1);
}
有一种递归的形式非常特别,就是递归调用在函数的最后,这种递归叫做尾递归。
所有的尾递归都可以改写成循环,所有的循环都可以改写成递归。
尾递归之所以特别,在于,它是函数的最后一行调用,所以不需要保存当前函数的任何状态,以及在函数调用完毕之后再恢复。

如果不是尾递归,要想改成递归的形式,就必须借助一个类似堆栈的数据结构才行。

递归未必是直接调用自身,也可以是间接调用。
return语句放在递归函数的中间也可以,但是应该有if语句或者别的控制语句确保return后面的语句被调用到,否则这些语句没有意义。比如一个二分搜索算法

int find(int arr[], int start, int end, int lookup)
{
if (start == end)
if (lookup == arr[start]) return start; else return -1;
if (arr[(start+end)/2]>lookup) 
return find(arr, start, (start+end)/2, lookup);
else if (arr[(start+end)/2]<lookup) 
return find(arr, (start+end)/2,end, lookup);
else
return (start+end)/2;
}

在这里,显然递归之后也可以写代码,但是要有if语句,确保它能被执行到。

只要一个函数有循环调用自身的形式就是递归;所有循环结构都能变成递归,但是没必要;递归当然只能出现在函数内部,因为递归指的是函数调用自身,return后加可以,因为也是在函数内部。

递归常应用于算法计算,遍历树结构数据,迭代计算
递归计算比较耗费内存,方法使用栈来存储运算,无限递归或是迭代过多的递归都会造成 栈空间不足。并不是所有程序都能转换为递归形式。
递归是一种计算方式,以函数调用函数本身,在其他地方调用递归函数,递归函数调用自己只到返回结果。
正确的递归函数 都有一个结束的条件使递归返回。否则将造成内存溢出错误。
return 函数本身,是可以的,它是递归调用本身的一种方式。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

3
C语言递归中数据消失了?应该怎么改写
1
C语言怎么用递归输出2的64次方
2
关于C语言的一道递归题
0
字符串的全排问题(递归函数)
0
C语言分治法练习快速排序中递归的逻辑运算问题
1
用递归计算一个组合数学方面的问题,怎么实现的C语言方法
2
还是递归计算,这个问题用C语言如何解决,困扰了我很1天了
1
一个非递归树的生成算法问题
0
线性递归序列的问题,递归函数倒推采用C语言的解法
0
函数方程等式的递归的一个比较的算法,如何利用C语言的思路去实现的
3
【c语言】:一个简单递归算法的调用:1020个西瓜几天后能卖完
1
新人小白 求解C语言递归函数相关问题
0
函数递归运算的运用算法问题,怎么采用C语言的程序的设计的思想实现?
0
递归函数编写计算求和的问题,怎么采用C语言的程序代码编写的过程去实现的呢?
0
采用递归编程技术实现汉诺塔,怎么使用C语言的程序的方式具体来编写程序完成这个算法
0
线性的递归序列问题的计算,采用的是 C 语言编程语言的程序设计的手段,如何写出代码来实现的
1
求一个代码c语言实现图的深度遍历(递归)、非递归算法以及实现图的广度遍历(队列)
2
大佬帮忙看一下这个递归子函数表达的算法,实在是看不懂,谢谢!
2
C语言 递归函数 传参问题
2
关于C语言中的递归与变量作用域问题