详细实例说明+典型案例实现 对递归法进行全面分析 | C++

简介: 在上面,我们通过一个生活中的实例以及两个递归的典型问题,去详细的分析了递归法的核心思想和在程序中的具体实现过程。从程序设计语言的角度来说,谈到递归的定义,可以这样来描述:假如一个函数或子程序是由它自身所定义或调用的,就称它为递归。它至少要定义两个条件,一个是可以反复执行的递归过程,另一个是跳出执行过程的出口。

320187b25a73feba598b1e3e343b1d4b_4c5195da7166d1e86393046680028194.jpeg

第二章    递归法


前言

       简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。


一、递归法是什么?

1.简要介绍

       递归是一种很特殊的算法,分治法和递归法它们共同运用到一种思想,就是都将一个复杂的算法问题进行分解,让其变成一个个规模越来越小的子问题从而进行解决。简单来说,在程序设计语言中,函数或子程序不只是能够被其他函数调用或引用,还可以去自己调用自己,这就是所谓的递归。递归在早期人工智能所用的语言中是整个语言运行的核心,C/C++、Java、Python等很多程序设计语言都具备递归功能。


2.生活实例

       ① 我们和朋友两人去看电影,由于没有相邻的座位两人就各自买了票。但是我因为需要去上厕所将自己的票给了朋友,并且他先进场了。我来到放映厅中由于没有电影票而不知道自己的位置,而我们朋友的座位在某一排的最里面,所以这时我们就需要让这排最左边的这个人向里面传话,而他的右边不是我们的那个朋友就继续传话...... 直到传到我们的朋友那里,然后他在把电影票从最里面一个个传到外面,直到传到我们的手上。这个生活中常见的例子,就很像我们所要学习的递归法。

06ac9d48173b4498d9d122a2fb701585_1e3d91d7a24e408fa894ed1b636e30f9.png



二、递归法的典型案例——阶乘函数&斐波那契数列

1.阶乘函数

①具体情况:(公式+实例)

04c96886e056c073dae022ab89a396ee_8f8f017eb15c4ae0a8d5349f2aa551e8.png


公式直接实现以及在程序代码中的实现过程

②递归调用算法代码段:

int recursive(int n)
{
  int sum;
  if (n == 1)   //终止递归的条件,跳出递归过程的出口
  return 1;
  else
  return sum=n * recursive(n - 1);    //sum=n*(n-1)!,直接去调用自己,反复递归过程
}

③ 代码展示(C++)


       实现案例:用递归算法去求解阶乘10的值。

#include<iostream>
using namespace std;
class digui {
public:
  long long fact(int x)
  {
  if (x == 1) {
    return result = 1;
  }
  else {
    return result = x * fact(x - 1);
  }
  }
  void showresult()
  {
  cout << result << endl;
  }
  int a;
  long long result;
};
void func()
{
  digui dg;
  cout << "请输入要求解的递归数:";
  cin >> dg.a;
  dg.fact(dg.a);
  dg.showresult();
}
int main()
{
  func();
}

④ 代码结果展示:

341f2ad9988d217d88953358ad4e825c_00df858278d04f62b84d7a0bd01e8a7f.png

2.斐波那契数列

①具体情况(公式+实例)

d7d7727e011af3ae9824c3fedea8e013_a03f41cfd1e04e7bb9ba975cd24ab6ab.png


公式直接实现以及在程序代码中的实现过程

②递归调用算法代码段:

int Fib(int n)
{
  if (n == 1 || n == 2)
  return 1;
  else
  return Fib(n - 1) + Fib(n-2);
}
③ 代码展示(C++)
        实现案例:用递归算法去求第10个斐波那契数。
#include<iostream>
using namespace std;
class digui {
public:
  int fibonacci(int x)
  {
  int m, n;
  if (x == 1 || x == 2)
  {
    return num = 1;
  }
  else
  {
    m = fibonacci(x - 1);
    n = fibonacci(x - 2);
    return num = m + n;
  }
  }
  void shownum()
  {
  cout << num << endl;
  }
  int a;
  int num;
};
void text()
{
  digui dg;
  cout << "输入你要求的第几个斐波那契数:";
  cin >> dg.a;
  dg.fibonacci(dg.a);
  dg.shownum();
}
int main()
{
  text();
}

④ 代码结果展示:    

afc868ab07763807071f11597452c394_817805e76ec044a9ba7baee95d86a85d.png

总结


       在上面,我们通过一个生活中的实例以及两个递归的典型问题,去详细的分析了递归法的核心思想和在程序中的具体实现过程。从程序设计语言的角度来说,谈到递归的定义,可以这样来描述:假如一个函数或子程序是由它自身所定义或调用的,就称它为递归。它至少要定义两个条件,一个是可以反复执行的递归过程,另一个是跳出执行过程的出口。


目录
相关文章
|
3月前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
56 2
|
29天前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
2月前
|
存储 算法 搜索推荐
对二叉堆的简单分析,c和c++的简单实现
这篇文章提供了对二叉堆数据结构的简单分析,并展示了如何在C和C++中实现最小堆,包括初始化、插入元素、删除最小元素和打印堆的函数,以及一个示例程序来演示这些操作。
39 19
|
2月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【10月更文挑战第8天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
3月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
51 3
|
3月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
47 3
|
3月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。 1. Perf 基础 1.1 Perf 简介 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件 1.2 Perf的安装 ubuntu 18.04: sudo apt install linux-tools-common linux-tools-4.15.0-106-gen
|
3月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
25 0
|
15天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
25 2
|
21天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
54 5