C语言中递归的实际应用与经典问题

 更新时间:2021年09月01日 11:28:59   作者:flyyyya  
函数以及函数的递归调用是学习C语言必须要掌握的内容,且递归作为经典的算法思想被广泛应用于程序设计中,下面这篇文章主要给大家介绍了关于C语言中递归的实际应用与经典问题的相关资料,需要的朋友可以参考下

一、什么是递归

递归简单的来说就是在函数中调用自己

它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的两个必要条件:

存在限制条件,当满足这个限制条件的时候,递归便不再继续。

每次递归调用之后越来越接近这个限制条件。

二、递归模板

void recursion(参数0) 
{
    if (终止条件)
    {
        return;
    }
    else
    {
        recursion(参数1)
    }
}

三、递归的实际应用

1.阶乘递归

int tmp(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else
	{
		return n*tmp(n - 1);
	}
}

2.斐波那契数列

斐波那契数列指的是这个数列从第3项开始,每一项都等于前两项之和。

递归算法:

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

非递归方法:

int fibonacci(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

四、递归的经典问题

汉诺塔问题

汉诺塔问题来源:

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

这里我们使用的方法是从特殊到一般,这也是数学问题中常用的方法。

首先我们设计一个盘,那就直接把这个盘从自身柱子移到目标柱。

其次我们看两个盘,三根柱子两个盘,先将上面的柱子移动到中间柱,然后将最下面的柱子移动到目标柱,最后中间的柱子。

再来看多个盘

void hanno(int n, char a, char b, char c)
{
	if (n == 1)
	{
		printf("%c->%c\n", a, c);
	}
	else
	{
		hanno(n - 1, a, c, b);//递归处理,一开始的时候,先将n-1个盘子移至过渡柱z上后再将最底下的大盘子直接移至目标柱子y
		printf("%c->&c\n", a, c);
		hanno(n - 1, b, a, c);//然后重复以上步骤,递归处理放在过渡柱z上的n-1个盘子,
	}
}

青蛙跳台阶

一只青蛙可以一次跳 1 级台阶或一次跳 2 级台阶,例如:跳上第一级台阶只有一种跳法:直接跳 1 级即可。跳上两级台阶,有两种跳法: 每次跳 1 级,跳两次; 或者一次跳 2 级.问要跳上第 n 级台阶有多少种跳法?

解题思路

我们设台阶数位N;

当N=1时,当然只有1种跳法;

当N=2时,青蛙可以跳2次1层和跳1次2层;

当N=3时,当有3层台阶时,青蛙可以选择先跳1层,剩下2层台阶,所以此时就是有2层台阶时的跳法,有2种;当青蛙选择第一次跳2层台阶时,剩下1层台阶,此时有1层台阶时的跳法,所以3层台阶时的方法是:2层台阶的方法 + 1层台阶的方法。

#include<stdio.h>
int frog(int n)
{
   if(n == 1)
   {
      return 1;
   }
   if(n == 2)
   {
      return 2;
   }
   return frog(n-1) + frog(n-2);
}
int main()
{
   int n;
   scanf("%d",&n);
   int ways = frog(n);
   printf("%d\n",ways);
   return 0;
}

总结

到此这篇关于C语言中递归的实际应用与经典问题的文章就介绍到这了,更多相关C语言中递归应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于C语言实现静态通讯录的示例代码

    基于C语言实现静态通讯录的示例代码

    这篇文章主要为大家详细介绍了如何利用C语言实现一个简单的静态通讯录,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-07-07
  • VSCode远程代码开发及DNS隧道端口转发实现远程办公代码

    VSCode远程代码开发及DNS隧道端口转发实现远程办公代码

    这篇文章主要介绍了VSCode远程代码开发及DNS隧道端口转发实现远程办公,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C语言实现学籍管理系统课程设计

    C语言实现学籍管理系统课程设计

    这篇文章主要为大家详细介绍了C语言实现学籍管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • C语言程序环境中的预处理详解

    C语言程序环境中的预处理详解

    这篇文章主要为大家详细介绍了C语言程序环境中的预处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++实现简单学生成绩管理系统

    C++实现简单学生成绩管理系统

    这篇文章主要为大家详细介绍了C++实现简单学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言进阶栈帧示例详解教程

    C语言进阶栈帧示例详解教程

    这篇文章主要为大家介绍了C语言进阶栈帧的示例详解教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • C++ float转std::string 小数位数控制问题

    C++ float转std::string 小数位数控制问题

    这篇文章主要介绍了C++ float转std::string 小数位数控制问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • QT中大部分部件如何使用举例详解

    QT中大部分部件如何使用举例详解

    QWidget类是所有用户界面对象的基类,被称为基础窗口部件,下面这篇文章主要给大家介绍了关于QT中大部分部件如何使用的相关资料,需要的朋友可以参考下
    2022-06-06
  • C++特殊成员函数以及其生成机制详解

    C++特殊成员函数以及其生成机制详解

    这篇文章主要给大家介绍了关于C++特殊成员函数以及其生成机制的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • C++实现简单走迷宫的代码

    C++实现简单走迷宫的代码

    这篇文章主要为大家详细介绍了C++实现简单走迷宫的代码,利用回溯法求解,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论