递归调用

今天cf遇见了一点问题,是自己学过却不怎么熟悉的递归调用。

    递归定义使人们能够用有限的语句描述一个无穷的集合。C++语言允许一个函数体中出现调用自身的语句,成为直接递归调用。也允许被调用的另一个函数反过来调用原函数,策划功能为间接递归调用。这种功能为递归结构问题提供了求解的实现手段,使程序语言的描述与问题的自然描述完全一直,因而使程序易于理解、易于维护。

    通过简单的例子说明递归函数的构成规律和执行过程。

    使用递归函数编程序求n!

    当n>=0时,阶乘可以用循环迭代(非递归)计算:

fact=1;
for(int k=n;k>=1;k--)
fact*=k;

也可以用另一种递归形式定义阶乘:


    阶乘的递归定义把问题分为两部分,一部分用已知的参数n作为被乘数,另一部分使用原来的阶乘定义作为参数。不过,乘数n*(n-1)的规模变小了,以此类推,问题的规模进一步缩小,从而产生越来越小的问题,最后归结到基本情况,0!=1。C++函数调用能够识别并处理这种基本情况,向前一个函数调用并返回结果,并回溯一系列的中间结果,直到把最终结果返回给调用函数。

    以下程序在main函数中调用求阶乘的递归函数。

#include<iostream>
using namespace std;
long fact(int n)
{
	if (n == 0)
		return 1;
	else
		return n*fact(n - 1);
}
int main()
{
	int n;
	cout << "Enter n(n>=0):";
	cin >> n;
	cout << n << "!="<<fact(n) << endl;
	return 0;
}

    递归函数执行由递推和回归两个过程完成。递归函数之所以能够实现,关键是系统使用堆栈来保存函数调用中的传值参数、局部变量和函数调用后的返回地址。函数自身调用进行递推:系统把有关参数和地址压进堆栈,一直递推到满足终止条件,找到问题的最基本模式为止。然后进行回归:系统从堆栈中逐层弹出有关参数和地址,执行地址所指向的代码,一直到栈空为止,得到问题的解。

    递归调用与一般函数调用,堆栈管理的操作过程是一致的。不同的是,函数的自身调用就像是产生多个正在运行(等待结束)的相同函数副本。如果这种调用不能终止并产生副本,将是程序十分严重的错误。

    构成递归函数有两个基本要素:

    描述问题规模逐步缩小的递归算法;

    描述基本情况的递归 终止条件。

     在fact函数中,递归调用的语句为:

    t=n*fact(n - 1);
由调用参数n-1,使问题规模逐渐缩小,直至到达递归带哦用终止条件:

    n==0
    返回基本情况值1.

    在程序中,递归算法和递归条件通常用条件语句表达。递归调用可以出现在语句中,也可以出现在判断表达式中。



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值