服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言深入分析递归函数的实现

C语言深入分析递归函数的实现

2022-11-10 14:42清风自在 流水潺潺 C/C++

递归(recursive)函数是“自己调用自己”的函数,无论是采用直接或间接调用方式。间接递归意味着函数调用另一个函数(然后可能又调用第三个函数等),最后又调用第一个函数。因为函数不可以一直不停地调用自己,所以递归

一、递归的数学思想

递归是一种数学上分而自治的思想

递归需要有边界条件

  • 当边界条件不满足时,递归继续进行
  • 当边界条件满足时,递归停止

递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理。

二、递归函数

函数体内部可以调用自己

递归函数

  • 函数体中存在自我调用的函数

递归函数是递归的数学思想在程序设计中的应用

  • 递归函数必须有递归出口
  • 函数的无限递归将导致程序栈溢出而崩溃

三、递归函数设计技巧

递归模型的一般表示法

C语言深入分析递归函数的实现

 

四、递归函数设计示例一

用递归的方法编写函数求字符串长度

C语言深入分析递归函数的实现

代码如下:

#include <stdio.h>

int strlen_r(const char* s)
{
  if( *s )
  {
      return 1 + strlen_r(s+1);
  }
  else
  {
      return 0;
  }
}

int main()
{
  printf("%d\n", strlen_r("abc"));
  printf("%d\n", strlen_r(""));
  
  return 0;
}

输出结果如下:

C语言深入分析递归函数的实现

 

五、递归函数设计示例二

斐波拉契数列递归解法

1,1,2,3,5,8,13,21,...

C语言深入分析递归函数的实现

代码如下:

#include <stdio.h>

int fac(int n)
{
  if( n == 1 )
  {
      return 1;
  }
  else if( n == 2 )
  {
      return 1;
  }
  else
  {
      return fac(n-1) + fac(n-2);
  }
  
  return -1;
}

int main()
{
  printf("%d\n", fac(1));
  printf("%d\n", fac(2));
  printf("%d\n", fac(9));
  
  return 0;
}

输出结果如下:

C语言深入分析递归函数的实现

 

六、递归函数设计示例三

汉诺塔问题

  • 将木块借助 B 柱由 A 柱移动到 C 柱
  • 每次只能移动一个木块
  • 只能出现小木块在大木块之上

C语言深入分析递归函数的实现

汉诺塔问题分解

  • 将 n-1 个木块借助 C 柱由 A 柱移动到 B 柱
  • 将最底层的唯一木块直接移动到 C 柱
  • 将 n-1 个木块借助 A 柱由 B 柱移动到 C 柱

C语言深入分析递归函数的实现

代码如下:

#include <stdio.h>

void han_move(int n, char a, char b, char c)
{
  if( n == 1 )
  {
      printf("%c --> %c\n", a, c);
  }
  else
  {
      han_move(n-1, a, c, b);
      han_move(1, a, b, c);
      han_move(n-1, b, a, c);
  }
}

int main()
{
  han_move(3, 'A', 'B', 'C');
  
  return 0;
}

输出结果如下:

C语言深入分析递归函数的实现

七、小结

  • 递归是一种将问题分而自治的思想
  • 用递归解决问题首先要建立递归的模型
  • 递归解法必须要有边界条件,否则无解

到此这篇关于C语言深入分析递归函数的实现的文章就介绍到这了,更多相关C语言 递归函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43129713/article/details/124164731

延伸 · 阅读

精彩推荐