函数那些事(c语言基础)下

八、函数递归

递归

程序调用自身的编程技巧称为递归( recursion)。

递归是一种方法

它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解

只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。


递归的条件

· 存在限制条件,当满足这个限制条件的时候,递归便不再继续。

· 每次递归调用之后越来越接近这个限制条件。


函数那些事(c语言基础)下_第1张图片


思路:

#include 
void print(int n)
{
	if (n != 0)
	{
		print(n / 10);
		printf("%d", n % 10);
	}
}
int main()
{
	print(1234);
	return 0;
}

函数那些事(c语言基础)下_第2张图片


值得注意的是

函数每调用一次,都会在内存开辟一块新的空间

而系统分配给程序的栈空间是有限的,但是如果出现死递归,这样有可能导致一直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出

那就会报错: stack overflow(栈溢出) 这样的信息。

那如何解决上述的问题:

1. 将递归改写成非递归。

2.将部分变量放入静态区(例如把int改成static int)

这不仅可以节省一些空间,提高效率

而且 static 对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。


例如:

#include 
int DigitSum(int  n)
{
	static int sum = 0;
	sum += n % 10;
	if (n / 10 != 0)
		return DigitSum(n / 10) ;
	else
		return sum;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = DigitSum(n);
	printf("%d ", ret);
	return 0;
}

这是一个实现各个位数相加之和的递归函数

这里在定义sum的时候就用的是static int 类型,

不仅节省了为sum重复开辟的空间

而且充分利用了static的特性

在进行递归时,因为sum值不会变,所以在每次得到值时,直接加进sum就好

最后返回sum的值

结果:

1234
10

函数基础 (下) 就到此,因为作者水平有限,欢迎提出意见或建议

你可能感兴趣的:(初识c语言,c语言)