什么是递归函数?

article/2025/9/12 3:54:40

文章目录

  • 递归函数
    • 递归
    • 例题
    • 特点
    • 效率
    • 优点

递归函数

递归

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件
当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件
所以递归要有两个要素,结束条件与递推关系

注:

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

例题

  1. 计算n的阶乘
#include <stdio.h> 
int factorial(int n)
{int result;if (n<0)                                          //判断例外{printf("输入错误!\n");return 0;} else if (n==0 || n==1){result = 1;  //回推墙}else{result = factorial(n-1) * n;  //递推关系,这个数与上一个数之间的关系。}return result;
}int main(){int n = 5;                                              //输入数字5,计算5的阶乘printf("%d的阶乘=%d",n,factorial(n));return 0;
}

程序在计算5的阶乘的时候,先执行递推,当n=1或者n=0的时候返回1,再回推将计算并返回。由此可以看出递归函数必须有结束条件

  1. 斐波那契数列

斐波那契数列指的是这样一个数列:

0, 1, 1, 2, 3, 5, 8, 13, 21, ···

这个数列从第三项开始,每一项都等于前两项之和.

#include <stdio.h>long fibonacci( long num )
{if ( num == 0 || num == 1 ){return num;}else{return fibonacci( num -1 ) + fibonacci( num -2 );}
}void main()
{long number;puts("请输入一个正整数: ");scanf("%ld", &number);printf("斐波那契数列第%ld项为: %ld\n", number, fibonacci( number ) );}

这里写图片描述

  1. 应用题~~

小明为了学好英语,需要每天记单词,第一天记1个,第二天记2个依次类推,请用代码完成,算出小明第10天开始的时候会了多少个单词?

分析:
墙(结束条件)是“第一天记1个”
递推关系是“第n天记的单词= 第n-1天记的单词数量+n"

#include <stdio.h>
/* 定义获取单词数量的函数 */
int getWordNumber(n)
{   if(n == 1){return 1;    //回推墙}else{return getWordNumber(n-1)+n ;       //递推关系}
}
int main()
{int num = getWordNumber(10);     //获取会了的单词数量printf("小明第10天记了:%d个单词。\n", num);return 0;
}

特点

递归函数特点:

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

一句话总结递归:自我调用且有完成状态。

效率

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

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

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

综上:

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

优点

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

循环能干的事,递归都能干;递归能干的循环不一定能干

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


http://chatgpt.dhexx.cn/article/P30IOuCI.shtml

相关文章

关于C语言中的递归函数

递归实例&#xff1a; #include <stdio.h>void up_and_down(int);int main(void) { up_and_down(1);return 0;} void up_and_down(int n) {printf("Level %d: n location %p\n", n, &n); // #1if (n < 4)up_and_down(n 1);printf("LEVEL %d: n …

C语言递归函数求n!的两种写法---详细讲解

递归函数&#xff1a;在调用一个函数的过程中又出现直接或间接地调用该函数本身&#xff0c;称为函数的递归调用。 题目&#xff1a;求n!的阶乘,n需要手动输入一个数。 解题思路&#xff1a;假设我们是求5的阶乘5&#xff01;&#xff0c;那么我就要知道4&#xff01;等于多少…

C语言——函数的递归

函数的声明和定义 函数声明&#xff1a; 1.告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么&#xff0c;但是具体是不是存在&#xff0c;并不重要。 2.函数的声明一般出现在函数的使用之前&#xff0c;要满足先声明后使用。 3.函数的声明一般要…

【C语言】函数递归详解

函数递归 1. 什么是函数递归2. 递归的两个必要条件2.1 练习1&#xff1a;打印一个数的每一位2.2 练习2&#xff1a;求字符串长度&#xff08;strlen 模拟实现&#xff09; 3. 递归与迭代3.1练习3&#xff1a;求 n 的阶乘&#xff08;不考虑溢出&#xff09;3.1.1 递归求 n 的阶…

C语言详解:函数递归专题

文章目录 函数递归函数递归的定义和优缺点递归的使用场景及必要条件递归的细节说明递归的习题讲解1打印整数每一位输入输出示例解题思路代码逻辑 2递归和非递归求n阶乘输入输出示例解题思路代码逻辑 3strlen函数模拟输入输出示例解题思路代码逻辑 4逆序字符串输入输出示例解题思…

2021-11-03

**"21天好习惯"第一期—12**1.递归函数&#xff08;二&#xff09; 程序在计算5的阶乘的时候&#xff0c;先执行递推&#xff0c;当n1或者n0的时候返回1&#xff0c;再回推将计算并返回。由此可以看出递归函数必须有结束条件。 递归函数特点&#xff1a; 1.每一级…

[C语言学习]----函数递归(超详细!!!)

本篇介绍的是C语言函数递归的详细知识 程序的艺术来源于生活 目录 7. 函数递归 7.1递归是什么 7.2 递归的两个必要条件 7.2.1练习1&#xff08;详细讲解&#xff09; 7.2.2练习2&#xff08;详细讲解&#xff09; 7.3 递归与迭代 7.3.1练习3&#xff08;详细讲解&#xff…

五、需求分析建模之数据库建模

1. 了解E-R图在基于数据库的软件系统分析中的作用。 2. 复习并深化理解E-R图的相关概念。 3. 学习从实际应用问题中抽取E-R模型的方法。 4. 掌握简单ER图模型建模工具 E-R模型 Entity-Relationship Model E-R模型是一种数据建模的思想。 1. E-R模型的基本观点&#xff1a; 世…

数据库设计(1)—需求分析

2019独角兽企业重金招聘Python工程师标准>>> 需求分析是设计数据库的起点&#xff0c;需求分析结果是否准确反映用户的实际要求将直接影响到后面各阶段的设计&#xff0c;并影响到设计结果是否合理实用。 一、需求分析的任务 需求的任务是通过详细调查现实世界要处理…

SQL数据库设计(一)---需求分析与逻辑设计

今天先来介绍 数据库设计中的需求分析和逻辑设计(ER图)阶段&#xff0c;明天介绍物理设计与维护优化,数据库设计是非常有意思的:-) 数据库设计 根据系统业务的需要&#xff0c;结合我们所选用的DBMS&#xff0c;为这个业务系统构建出最优的数据存储模型。 并建立好数据库中的表…

数据库设计2————需求分析

需求分析任务 1、信息需求。明确数据库需要存储的数据&#xff0c;对这些数据将哪些梳理&#xff0c;同时还要描述数据间的联系。 2、处理需求。定义系统数据处理的操作功能&#xff0c;描述操作的优先次序。包括操作的执行频率和场合&#xff0c;操作与数据间的联系&#xff…

数据库设计(一) 需求分析

目前&#xff0c;大多数的应用系统都属于数据库应用程序&#xff0c;都离不开数据库的支持。数据库设计方案的优劣对于应用程序的运行至关重要。数据库设计过程就是针对具体的应用环境&#xff0c;设计优化的逻辑模式&#xff0c;并根据所采用的数据库系统设计物理结构&#xf…

三、数据需求与数据库设计

数据需求与数据库设计 数据需求 项目中主要包含了用户、权限&#xff08;菜单&#xff09;、角色三种类型的数据&#xff0c;各种数据包含的数据项如下&#xff1a; &#xff08;1&#xff09;用户&#xff1a;用户名、密码、生日、头像、简介、用户类型 &#xff08;2&…

SQL数据库实战需求分析→数据库设计

从这开始&#xff0c;就真正进入项目实战啦。先说点体会&#xff0c;我刚开始接触编程的时候&#xff0c;都是编写一些小东西&#xff0c;往往都是半天或者一天什么的就编完了&#xff0c;那时候根本没想过做程序之前还要有需求分析。经过快两年的学习&#xff0c;接触的都是比…

数据库性能需求分析及评估模型

数据库作为应用系统当中最重要的一块&#xff0c;也是性能测试非常关注的一块&#xff0c;根据我自己的项目经验&#xff0c;和以往对应用系统的性能需求分析和测试策略制定过程&#xff0c;总结一下如何开展数据库系统的性能需求分析&#xff0c;以及制定数据库能力评估模型。…

互联网应用开发实践:需求分析与数据库设计

在本文中将分析一个用于新生开学分配寝室的“宿舍秒杀”系统。从用户故事开始探索需求&#xff0c;进而分析得到系统的主要功能和非功能性需求。最后&#xff0c;根据需求分析设计数据库&#xff0c;数据库的设计原则是尽可能的方便之后的需求拓展和修改。 用户故事 用户故事一…

数据库应用系统的需求分析

一 需求分析的概念与意义 所谓的需求分析&#xff0c;就是对待开发系统要做什么&#xff0c;完成什么功能的全面描述 软件的一些特性使得需求的获取常常并不容易&#xff01; 比如软件功能复杂&#xff0c;需求可变性&#xff0c;软件的不可见性 二 获取需求的方法 面谈实地…

数据库设计:需求分析

设计一个性能良好的数据库系统&#xff0c;明确应用环境对系统的要求是首要的和基本的。因此&#xff0c;应该把对用户需求的收集和分析作为数据库设计的第一步。 需求分析的主要任务是通过详细调查要处理的对象&#xff0c;包括某个组织、某个部门、某个企业的业务管理等&…

数据库设计 | 需求分析

一、需求分析要干一个什么样的事情&#xff1f; 通过详细调查现实世界要处理的对象&#xff08;组织、部门、企业等&#xff09;&#xff0c; 充分了解原系统&#xff08;手工系统或计算机系统&#xff09;工作概况&#xff0c; 明确用户的各种需求&#xff0c;然后在此基础上确…

数据库设计之需求分析

需求分析简单地说就是分析用户的需求。根据分析是设计数据库的起点&#xff0c;需求分析结果是否准确反映用户的实际要求将直接影响到后面各阶段的设计&#xff0c;并影响到设计结果是否合理和实用。 1. 需求分析的任务 需求分析的任务是通过详细调查现实世界要处理的对象(组…