C/C++ 函数的递归调用原理和演示

C允许函数调用它自己,这种调用过程成为递归(rcursion)。

结束递归室递归的难点。如果递归代码中没有终止递归的条件测试部分,一个调用自己的函数会无线递归。

一般可以使用循环的地方通常都可以使用递归。有时使用循环解决问题比较好,但有时使用递归更好。递归
方案耕机安检,但效率却没有循环高。

递归的基本原理:
    1. 每级别函数调用都有自己的变量;
    2. 每次函数调用都会返回一次;
    3. 递归函数中位于递归调用之前的语句,都按被调函数的顺序执行。
    4. 递归函数中位于递归调用之后的语句,都按被调函数相反的顺序执行。
    5. 虽然每级递归都有自己的变量,但是并没有拷贝函数的代码。
    6. 递归函数必须包含能让递归调用停止的语句。
    
演示源码1:

// Len_Rcursion.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
void up_and_down(int n)
{
	printf("In %d: n location %p\n", n, &n);
	if (n < 4)
	{
		up_and_down(n + 1);
	}
	else if (n >= 4)
	{
		printf("\n");
	}
	printf("Out %d: n location %p\n", n, &n);
}
// 使用循环的函数,实现 n!=1*2*...*n
long Fact(int n)	
{
	long ans;
	for (ans = 1; n > 1; n--)
	{
		ans *= n;
	}

	return ans;
}
// 使用递归的函数,实现 n!=1*2*...*n
long RFact(int n)	
{
	long ans;
	printf("In %d: n= %p\n", n, &n);
	if (n > 0)
		ans = n * RFact(n - 1);
	else
	{
		ans = 1;
		printf("\n");
	}
	printf("Out %d: n= %p\n", n, &n);
	return ans;
}
int main()
{
	up_and_down(1);

	//long fact1 = Fact(5);
	//printf("fact1=%ld\n\n", fact1);

	//long fact2 = RFact(5);
	//printf("fact2=%ld\n", fact2);
	return 1;
}

示例说明:


执行结果:

演示源码2:

// Len_Rcursion.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

// 使用递归的函数,实现 n!=1*2*...*n
long RFact(int n)
{
	long ans = 0;
	printf("In n=%d, local(n)= %p\n", n, &n);
	if (n > 0)
	{
		ans = n * RFact(n - 1);
	}
	else
	{
		ans = 1;
		printf("\n");
	}
	printf("Out ans=%d, n=%d, local(n)= %p\n", ans, n, &n);
	return ans;
}
int main()
{
	long fact2 = RFact(5);
	printf("fact2=%ld\n", fact2);
	return 1;
}

示例说明:


执行结果:


递归的优缺点:
    优点是递归为某些编程问题提供了最简单的解决方案。
    缺点是一些递归算法会快速消耗计算机的内存资源,其次递归不方便阅读和维护。

  • 36
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WendyWJGu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值