什么是递归函数?[通俗易懂]

什么是递归函数?[通俗易懂]递归函数递归例题特点效率优点递归函数递归递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。所以递归要有两个要素,结束条件与递推关系注:递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

递归函数

递归

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

注:

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

例题

  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. 代码简洁、清晰,易懂

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194828.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 简单介绍T检验和卡方检验「建议收藏」

    简单介绍T检验和卡方检验「建议收藏」最近在看统计学方面的知识,正好有个学妹问我一些检验方面的东西,以前读书那会的统计学知识早已忘记,经过半天的努力,又把知识给拾起来了,下面简单介绍下T检验和卡方检验。1. T检验适用范围:主要用于样本含量较小(例如n总体标准差σ未知的正态分布。其中最常用的是单总体t检验,单总体t检验是检验一个样本平均数与一个已知的总体平均数的差异是否显著。当总体分布是正态分布,如总体标准差未知

    2022年6月19日
    51
  • ostream iterator

    ostream iterator1.ostream_iteratortemplate         class_CharT=char,class_Traits=char_traits>classostream_iterator{public: typedef_CharT                        char_type; typedef_Traits

    2025年6月10日
    3
  • linux怎么查看系统环境变量路径,Linux系统中的环境变量该如何设置与查看

    linux怎么查看系统环境变量路径,Linux系统中的环境变量该如何设置与查看今天小编要跟大家分享的文章是关于Linux系统中的环境变量该如何设置与查看。大家都知道,在Linux系统中,有环境变量和Shell变量这两种变量。环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路径等等这样的信息。而Shell变量仅在当前Shell中可用,可以用来存储当前用户的ID等信息。那么什么是环境变量,什么是Shell变量…

    2022年10月1日
    4
  • Java安全之反序列化回显研究

    Java安全之反序列化回显研究0x00前言续上文反序列化回显与内存马,继续来看看反序列化回显的方式。上篇文中其实是利用中间件中存储的Request和Response对象来进行回显。但并不止这么

    2021年12月13日
    68
  • 制作PFX证书

    制作PFX证书1、创建根证书密钥文件root.keyC:\Users\lijunlin>opensslgenrsa-des3-outroot.keyGeneratingRSAprivatekey,2048bitlongmodulus…………………………………………………………….+++.+++eis65537(0x10001)Enterpassphraseforroot.k

    2022年6月7日
    47
  • 对LARS(Least Angle Regression)的简单理解

    对LARS(Least Angle Regression)的简单理解前言我在本科的时候接触过用LASSO筛选变量的方法,但了解不多。这几天在公司实习,学习到特征选择,发现还有个LARS是经常和LASSO一起被提起的,于是我临时抱佛脚,大概了解了一下LARS的原理。在看文章的时候发现很多人提到SolutionPath这样一个概念,感觉很费解,后来参阅了Efron等人的&quot;LeastAngleRegression&quot;论文,总算是明白了一些。不过本人由于懒,后面数学…

    2022年6月20日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号