首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >递归函数

递归函数

作者头像
大忽悠爱学习
发布于 2021-03-04 10:38:04
发布于 2021-03-04 10:38:04
1.6K0
举报
文章被收录于专栏:c++与qt学习c++与qt学习

递归

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。

注: 递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当被调函数返回的时候,调用函数中的变量依然会保持原先的值,否则也不可能实现反向输出。

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//递归
void test(int num)
{
	if (num == 1)
	{
		printf("%d\n", num);
		return;//终端函数很重要
	}
	test(num - 1);
	printf("%d\n", num);
}
int main()
{
	test(3);
	printf("main\n");
	return 0;
}

输出结果:123

字符串逆序输出

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//利用递归实现字符串的逆序输出
void test(const char *str)
{
	if (*str == '\0')//比较的是字符串是否等于\0
		return;
	test(str + 1);
	printf("%c\n", *str);//每次打印字符串中第一个字符
}
int main()
{
	test("happy end");
	printf("\n");
	return 0;
}

斐波那契数列:前两项之和等于第三项

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//斐波那契数列 1 1 2 3 5 8 13 21 34 55....
int test(int num)
{
	if (num == 1 || num == 2)
		return 1;
	else
		return test(num - 1) + test(num-2);
}
int main()
{
	printf("%d", test(10));
	printf("\n");
	return 0;
}

阶乘

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//阶乘:n表示 阶乘 乘到几
int test(int num)
{
	if (num <= 0)
	{
		printf("输入有误");
		return 0;
	}
	if ( num == 1)
		return 1;
	return test(num - 1) * num;
}
int main()
{
	printf("%d", test(5));
	printf("\n");
	return 0;
}

特点:

递归函数特点

  1. 每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;
  2. 每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;
  3. 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;
  4. 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;
  5. 递归函数中必须有终止语句。

效率

1.系统栈(也叫核心栈、内核栈) 是内存中属于操作系统空间的一块区域,其主要用途为: (1)中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出; (2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

2.用户栈 是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。 我们编写的递归程序属于用户程序,因此使用的是用户栈。

3.栈溢出 函数调用的参数是通过栈空间来传递的,在调用过程中会占用线程的栈资源。而递归调用,只有走到最后的结束点后函数才能依次退出,而未到达最后的结束点之前,占用的栈空间一直没有释放,如果递归调用次数过多,就可能导致占用的栈资源超过线程的最大值,从而导致栈溢出,导致程序的异常退出。

综上: 函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N次局部变量、N次形参、N次调用函数地址、N次返回值,势必效率低.

优点

1.代码简洁、清晰,易懂

对于我们,能用循环解决的,尽量不适用递归.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 递归
  • 斐波那契数列:前两项之和等于第三项
  • 阶乘
  • 特点:
  • 效率
  • 优点
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档