C++基础---递归函数

2023-11-03

1. 递归函数

1.1 递归函数的定义

  • 递归函数:即在函数体中出现调用自身的函数,即函数Func(Type a,……)直接或间接调用函数本身;
  • 递归函数:在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值x0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数;
  • 递归函数:不能定义为内联函数;

1.2 递归的本质

  • 递归函数的例子:
    (1)例子一:阶乘n!

    递归的数学函数描述:
    f(n)=1 (n=1)
    f(n)=n*f(n-1) (n>1)
    递归的C++函数描述:
    unsigned int f(unsigned int n)
    {
        if(n==1) 
            return 1;
        return n*f(n-1);
    }

    注:由于f(13)>2^32。所以对于unsigned int型(无符号类型)的表示范围,其n的取值范围只有1<=n<=12了。
    (2)例子二:Fibonacci数列

    递归的数学函数描述:
    f(n)=0 (n=0)
    f(n)=1 (n=1)
    f(n)=f(n-1)+f(n-2) (n>2)
    递归的C++函数描述:
    unsigned int f(unsigned int n)
    {
        if((n==0) || (n==1))
            return n;
        return f(n-1)+f(n-2) ;
    }

    注:由于f(47)>2^32。所以对于unsigned int型(无符号类型)的表示范围,其n的取值范围只有1<=n<=46了。

  • 递归有直接递归和间接递归之分:
    (1)直接递归:直接调用函数本身
    (2)间接递归:指函数体中没有直接调用自身函数,而是调用了另一个函数,在那个函数里,出现了调用本函数的语句。或者,在那个函数里,又调用了一个其他函数,反复出现调用其它函数,而最后有一个函数调用了本函数
    注:递归函数在运行中,其调用与被调用函数的指令代码是同一个函数副本,只不过各个不同运行中的调用点作为状态的一部分,在栈中被分别保护了起来。因此,是C++的函数机制决定了递归操作中的数据独立性,因而使递归调用成为可能。

1.3 递归条件

  • 递归不能无限制地调用下去,因为栈空间是有限的。所以递归函数是有条件地调用自身,该条件就是递归的停止条件;
  • 递归函数中必须有完成终极任务的语句序列(如:return 1;),以使函数有意义,递归调用,并非终极;
  • 递归函数当然有递归调用语句,递归调用应有参数,而且参数值应该是逐渐逼近停止条件;
  • 递归条件应先测试,后递归调用,无条件递推的逻辑错误,编译器是检查不出来的,要靠程序员自己把握;
    注:消去递归,即大多数递归函数都能用非递归函数来替代,一般用循环语句实现。

1.4 递归函数的优缺点

  • 优点:
    (1)简化程序设计,使程序易读;
    (2)作为对特殊问题的一种处理方法,递归仍然占有一席之地;
    (3)许多高难算法的简捷描述,往往采用递归,特别对于能较快逼近停止条件的、优化了的递归函数;
    (4)递归在迅速退栈的技术处理上得到了异常机制的帮助;
  • 缺点:
    (1)递归会迅速递增系统开销;
    (2)在时间上,执行函数的调用与返回的次数明显要大于非递归函数;
    (3)在空间上,栈空间资源会遭到空前的劫掠,随着每递归一次,栈内存就会多占用一截;

参考文献:
[1]《C++全方位学习》范磊——第十章
[2]《C++程序设计教程(第二版)》钱能——第五章、第六章、第七章
[3]《C++ Primer(第5版)》王刚 杨巨峰——第一章、第六章
[4] 百度搜索关键字:C++函数、递归函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础---递归函数 的相关文章

  • c++职工管理系统

    要求 代码 management system cpp main函数 include
  • Cpp学习——模板

    模板 目录 模板 1 介绍 2 函数模板的使用 3 函数模板的强制转换or显式调用 四 模板的分类 1 介绍 在Cpp3 0中 祖师爷便引入了模板的概念 这是一个重大的变革 为后来的Cpp标准化打下了铺垫 也正是因为有了模板 Cpp才能有S
  • C++ Char操作

    C Char操作 1 字符处理函数 isalpha ch 如果ch是一个字母 返回非 int 0值 否则 返回 int 0 isalnum 判断是否是字母或者数字字符 isdigit 判断是否是数字字符 0 9 islower 判断是否是小
  • C++数据类型(整型、浮点型、字符型、字符串型、布尔型)

    文章目录 1 整型 2 sizeof关键字 3 浮点型 实型 4 字符型 5 转义字符 6 字符串型 7 布尔类型 bool 8 C 数据类型小结 9 数据的输入 C 创建变量或常量时 必须指定数据类型 否则无法为变量分配内存 数据类型的意
  • MySql.Data连接数据库mysql

    using MySql Data MySqlClient using MySql Data using System Data using System IO MySqlConnection con new MySqlConnection
  • C++基础:for循环

    美好的知识点从出题开始 输出1 100所有的奇数 看到这道题 你可能有点懵 回顾标题 你找到办法了 但你不知道怎么写 来看看for循环的代码框架吧 for 控制变量初始化表达式 条件表达式 增量表达式 语句1 刚看到这 你肯定不太懂 我实际
  • 同步和异步的区别

    同步 同指一个进程在执行某个请求的时候 若该请求需要一段时间才能返回信息 那么这个进程将会一直等待下去 直到收到返回信息才继续执行下去 异步 是指进程不需要一直等下去 而是继续执行下面的操作 不管其他进程的状态 当有消息返回时系统会通知进程
  • c# 位运算符

    说来惭愧 今天看别人提供的源码 看了这些运算符竟然有些记不起来 在这里就记录一下 首先认识这些运算符 按位与 其实与 逻辑运算符有一致的地方 下面会讲到 按位或 同样与 有类似的地方 按位取反 按位异或 lt lt 左移运算符 gt gt
  • 为什么C++有多种整型?

    C 中有多种整型是为了满足不同的需求 提供更灵活和高效的整数表示方式 不同的整型具有不同的字节大小 范围和精度 可以根据应用的需求选择合适的整型类型 以下是一些原因解释为什么C 有多种整型 内存和性能优化 不同的整型在内存中占用的空间不同
  • 【千律】C++基础:多态性与虚函数

    虚函数 通过父类的指针 指向子类的对象 调用虚函数时 调用子类的函数 include
  • 【千律】C++基础:string扩展工具箱的使用方法

    include
  • 关于对象的引用作为参数,可以直接访问私有成员的问题

    include using namespace std class CPoint public CPoint int xx int yy x xx y yy CPoint const CPoint p x p x y p y private
  • C# LINQ的基础使用方法

    关键字 from in where select orderby descending 例子 Linq的简单运用 1 用Linq查询集合中所有符合条件的内容 表达式写法 var result from temp 临时变量 in myList
  • 【千律】C++基础:析构函数

    报错strcpy不安全 解决方法 项目 gt 属性 gt C C gt 预处理器 gt 预处理器定义 添加 CRT SECURE NO DEPRECATE CRT NONSTDC NO DEPRECATE include
  • 条件编译小结

    编码的时候经常要用到条件编译 每次都到网上去查比较浪费时间 今天总结一下以备后用 编译器 GCC ifdef GNUC if GNUC gt 3 GCC3 0以上 Visual C ifdef MSC VER 非VC编译器很多地方也有定义
  • LeetCode之最长公共子序列问题LCS解决方法

    Leetcode官网解答 使用动态规划原理 请参考原文地址 https leetcode cn com problems longest common subsequence solution zui chang gong gong zi
  • 在C++中 ,什么时候用:: ?什么时候用. ?什么时候用->?

    在C 中 什么时候用 什么时候用 什么时候用 gt 在 C 中 和 gt 是三种不同的运算符 用于访问类 结构体 命名空间 指针等的成员 它们的使用场景如下 作用域解析运算符 用于访问命名空间的成员或静态成员 例如 假设有一个命名空间 My
  • uthash

    在软件开发中 不可不免的会使用到hash表 hash表的优点这里就不说了 以下介绍一个hash表的C实现 uthash是用宏实现的 使用的时候非常方便 只用包含uthash h即可 Uthash的三个数据结构 1 typedef struc
  • C++ 11 新特性之统一初始化语法

    C 之前的初始化语法很乱 有四种初始化方式 而且每种之前甚至不能相互转换 让人有种剪不断 理还乱的感觉 曾经去面试 就有人问我string有几种初始化方式 当时就说出了两种 fuck 面试官还得意的说 你连基本的初始化方式都记不清 还做啥2
  • 斗地主AI算法之发牌,洗牌

    斗地主游戏的基本算法实现 by wojiushi3344 转载请说明出处 源代码下载 PS 首先祝朋友们5 1节快乐 闲来无事 今天来写一下斗地主游戏的基本实现 写得不好 大家别喷哈 具体实现还得参见源代码 朋友们如果你有更好的建议可以到我

随机推荐

  • 通过Git使用GitHub

    目录 一 建立个人仓库 二 配置SSH密钥 三 克隆仓库代码 四 推送代码到个人仓库 五 代码拉取 一 建立个人仓库 1 建立GitHub个人仓库 首先注册GitHub用户 注册好了之后 打开用户的界面 然后就是配置问题 配置好后拉到最下方
  • docker网络--多机通信--4--ingress笔记

    docker网络 多机通信 4 ingress 一 介绍 二 ingress网络 1 啥 2 增 3 删 4 改 5 查 三 ingress实验 1 说明 2 整体拓扑图 3 实验步骤 1 预置条件 2 步骤 4 原理说明 四 外部负载均衡
  • spring-bean的生命周期和怎么配置spring-bean的后置处理器

    前言 本章是spring基于XML 配置bean系类中第6篇讲解spring bean的生命周期和怎么配置spring bean的后置处理器 个人主页 尘觉主页 个人简介 大家好 我是尘觉 希望我的文章可以帮助到大家 您的满意是我的动力 在
  • 计算PI值到一亿位的算法 (转)

    计算PI值到一亿位的算法 转 more 我大体上考虑了一下用Delphi计算PI值到一亿位的算法 得到一个大体的算法 也好用来交流一下 这是一个构造一种新的长四则运算的算法 所谓长四则运算 是指用数据库的字段来作一个小数 用一个记录来作一个
  • 基于python的毕业设计仓库库存管理系统

    更多项目资源 最下方联系我们 目录 Python项目介绍 资料获取 Python项目介绍 计算机毕业设计python毕设项目之python仓库库存管理系统 IT实战课堂 哔哩哔哩 bilibili计算机毕业设计python毕设项目之pyth
  • 微信浏览器清理缓存的方法

    项目场景 项目包含电脑浏览器和手机的微信公众号两个部分 现在需要在微信端对项目进行测试 问题描述 在微信端打开项目的网页 发现某些部分的功能不如预期 退出微信并在服务器端进行修改 修改完成再次打开该网页 跟修改前的表现一样没有任何变化 原因
  • 企业u盘系统服务器,服务器u盘装系统

    服务器u盘装系统 内容精选 换一换 如果Linux操作系统云服务器未安装密码重置插件 可以参见本节内容重新设置密码 本节操作重置的是root用户的密码 您可以重置完root密码后登录云服务器后再更换秘钥或重置非root用户的密码 Windo
  • Group conv vs. Depthwise separable conv

    本王有话说 这俩属于是做轻量化绕不开的经典工作 盘踞武林好多年 我们的目标学会并企图超越它 分组卷积 Group conv paper 原理 分组卷积 即ResNeXt的亮点 受Inception和AlexNet的启发产生 Inceptio
  • 通过css样式定义span标签实现文本输入框功能

    span style width 200px height 24px line height 24px font size 14px padding 5px 8px border 1px solid ddd 我是文本输入框 span
  • TensorFlow学习过程记录 -- 问题解决

    在运行过程中 输出总是会产生两行警告信息 WARNING tensorflow From D python35 lib site packages tensorflow python util tf should use py 118 in
  • 机器学习中概率论知识复习

    机器学习先验知识概率论部分 发现看Machine Learning Andrew Ng 课程的时候中间有推导过程不是很明白 遂针对性复习 知识内容组织结构 参考 Probability Theory Review for Machine L
  • 使用PHP生成Excel文件并通过邮件发送

    需求 每周一自动检测一个月内即将过期的用户 生成excel2007文件 xlsx文件 并发送给指定的人员 做成一个脚本 使用定时任务即可解决 脚本分解为两步 生成Excel 发送邮件 一 生成Excel 使用简单的更改文件头 header
  • Java入门(6)——集合、基本数据类型和引用数据类型的相互转换

    集合 1 HashMap gt 类 概述 通过key可以找到value key就是键 values就是值 俗称键值对 特点 无序的 值可以重复 键不可以重复的 如果重复了 值就会覆盖 回顾 10 int num 10 jack String
  • Python基础内容:适合刚入门的朋友看的教程

    1 基本概念 1 1 四种类型 python中数有四种类型 整数 长整数 浮点数和复数 整数 如 1 长整数 是比较大的整数 浮点数 如 1 23 3E 2 复数 如 1 2 j 1 1 2 2j 1 2 字符串 字符串 字符的序列 pyt
  • ResNet50模型学习笔记

    ResNet的各种网络结构图如下图所示 ResNet的层级结构 Layer gt Block gt Stage gt Network Layer是最小的单位 ResNet50代表有50层 Block由两层或者三层conv层叠加而成 50层以
  • JavaWeb-form传值(从一个jsp页面传数据到另一个jsp页面)

    第一个页面 login jsp
  • OkHttpClient获取文件并下载

    需要调用第三方接口获取文件 本地通过网页直接下载 public Result doExcelExport String repoId HttpServletResponse response try if StringUtils isBla
  • nginx配置指南

    nginx conf配置 找到Nginx的安装目录下的nginx conf文件 该文件负责Nginx的基础功能配置 配置文件概述 Nginx的主配置文件 conf nginx conf 按以下结构组织 配置块 功能描述 全局块 与Nginx
  • 行为型设计模式之策略模式【设计模式系列】

    系列文章目录 C 技能系列 Linux通信架构系列 C 高性能优化编程系列 深入理解软件架构设计系列 高级C 并发线程编程 设计模式系列 期待你的关注哦 现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everythin
  • C++基础---递归函数

    1 递归函数 1 1 递归函数的定义 递归函数 即在函数体中出现调用自身的函数 即函数Func Type a 直接或间接调用函数本身 递归函数 在数学上 关于递归函数的定义如下 对于某一函数f x 其定义域是集合A 那么若对于A集合中的某一