9.栈的应用-递归函数转非递归函数

1.理论

前面说过递归函数的本质是使用栈结构,每次向下递归时,保存当前的参数和工作记录,具体不再详述。

在一个函数中调用另一个函数:

在运行另一个函数前,系统要完成3件事

1.将所有的参数、返回地址等信息传递给被调用函数保存

2.为被调用函数局部变量分配存储区

3.将控制转移到被调用函数入口

被调用函数返回到调用函数前也要完成3件事

1.保存被调用函数的计算结果

2.释放被调用函数的数据区

3.依照被调用函数保存的返回地址将控制转移到调用函数


可见多层递归的效率非常低,因为它需做各种重复性的参数和工作环境保存及恢复工作。为了提高效率,我们可以考虑将其转换成非递归函数,其核心思想就是利用栈模拟函数的调用过程。看如下计算计算阶乘的递归函数转换过程过程即可窥一斑而见全豹。


2.演示程序

递归实现

//递归求解n的阶乘
int f1(n)
{
	if (0 == n)
	{
		return 1;
	}
	else
	{
		return n * f1(n-1);
	}
}

非递归实现

//非递归求解n的阶乘
int f2(n)
{
	JWArray *pStack;
	int nResult = 1;
	int e;

	pStack = JWArrayCreate(20, 10);

	//递归终止条件
	if (n == 0)
	{
		return 1;
	}

	//递归压栈
	while (n != 0)
	{
		JWArrayPush(pStack, n);
		n--;
	}

	//递归出栈
	while (JWARRAY_TRUE == JWArrayPop(pStack, &e))
	{
		nResult *= e;
	}

	JWArrayDestroy(pStack);

	return nResult;
}

完整程序下载链接

原创,转载请注明来自http://blog.csdn.net/wenzhou1219


你可能感兴趣的:(数据结构,递归,栈,JWArray)