首页 > 其他分享 >递归

递归

时间:2023-07-21 10:23:36浏览次数:43  
标签:移动 递归 终止 盘子 柱上 rightarrow

递归概念

简单的来说,递归就是在函数里面再调用它本身,其目的是把复杂的问题分解成与原问题相似但规模较小的问题来解决,这样大大减少了程序的代码量。

递归条件

递归是需要一个终止条件的,否则就是一个死循环。比如求\(x^n\),可以转化为\(x^n=x*x^{n-1}\),\(x^{n-1}=x*x^{n-2}\)...而它的小终止条件就是\(x^0\)。具体见代码:

int xn(int n){
	if(n==1) return 1;//终止条件 
	else return x*xn(n-1);//递归 
}

递归应用

讲到递归,那么就不得不提一道递归的经典题:汉诺塔问题
image
大致意思就是把\(a\)柱的\(n0\)个盘子移到\(c\)柱上,期间只能小盘子在大盘子之上。
先从简单的三个盘子来看,具体步骤为 \(a\rightarrow c,a\rightarrow b,c\rightarrow b,a\rightarrow c,b\rightarrow a,b\rightarrow c,a\rightarrow c\)
如果把第3步,第4步,第7步拿出来看,那么可以把上面两个盘子看作一个整体在移动,就可以把三个盘子移动分解成两个盘子移动。
同理,如果是移动n$$个盘子,那么就是把其上面\(n-1\)个盘子移动。那么,原问题就变为:

  1. 欲将\(a\)柱的\(n\)个盘子移到\(c\)柱,就先把上面\(n-1\)个盘子到\(b\)柱,\(a\)柱为源柱,\(b\)柱为目标柱,\(c\)柱为过渡柱,记为\((a,b,c)\)
  2. 将\(a\)柱上的一个盘子移动到\(c\)柱
  3. 将\(b\)柱上的\(n-1\)个盘子移动到\(c\)柱上,记为\((b,c,a)\)
    接着,就是它的终止条件。它的终止条件应该是当\(n=0\)时,就退出那层循环。具体代码如下:
void mov(int n,char a,char c,char b)
{
    if (n == 0)//如果盘子数为0就推出  
    {
        return ;
    }
    else
    {
        mov(n - 1,a,b,c);//把a盘移到b盘,中间借助c盘  
        cout << "move " << n << " from " << a << " to " << c << endl;//把大的一块放过去就cout  
        mov(n - 1,b,c,a);//把b盘移到c盘,中间借助a盘  
    }
}

例题

斐波那契数列

标签:移动,递归,终止,盘子,柱上,rightarrow
From: https://www.cnblogs.com/jzx1020/p/17570568.html

相关文章

  • windows java 递归找到文件夹,并修改名称
    WindowsJava递归找到文件夹并修改名称说明在这篇文章中,我将向你解释如何使用Java编写一个递归算法,用于在Windows操作系统中找到文件夹并修改其名称。我将使用Java在Windows环境中进行文件和目录操作。在这个过程中,你将学习如何使用Java的File类来遍历目录树、找到文件夹、修改......
  • 装饰器/递归/算法
    多层装饰"""语法糖会将紧挨着的被装饰对象的名字当做参数自动传入装饰器函数中"""#判断七句print执行顺序defoutter1(func1):print('加载了outter1')打印顺序③和前面的定义对应defwrapper1(*args,**kwargs):print('执行了wrapper1')打印顺序④......
  • 实验3《递归下降分析法设计与实现》(java版)
    实验3《递归下降分析法设计与实现》(java版)引言在本次实验中,我们将使用递归下降分析法来设计和实现一个简单的语法分析器。递归下降分析法是一种基于产生式的自顶向下的语法分析方法,通过递归地向下扩展产生式,直到匹配输入串或者遇到错误。实验流程下面是整个实验的流程,我们将......
  • 递归相关知识2
    递归相关知识2多路递归--斐波那契额数列importjava.util.Arrays;//递归求斐波那契第n项publicclassfeibonaqie{publicstaticintfibonacci(intn){int[]cache=newint[n+1];Arrays.fill(cache,-1);cache[0]=0;cache[1]=1;//......
  • Java优化递归查询Mysql节点树数据
    示例目前有一个功能:任务计划管理,必然存在多级子任务的父子级关系,每个任务还会存在其它数据的关联表。mysql无法一次性递归查出想要的数据结构,想必很多人都会是通过根目录递归查询数据库的方式查出树结构数据。如果节点数较多,就会造成大量请求Mysql查询,效率会很低。那么如......
  • 递归相关知识(java)版
    递归递归小题练习publicstaticintf(intn){if(n==1){return1;}returnn*f(n-1);}publicstaticvoidmain(String[]args){intf=f(5);}递归反向打印字符串-c的话,就正序,java正逆无所谓publicst......
  • 使用SQL语句写递归查询
    要编写递归SQL语句,你可以使用通用表达式(CommonTableExpressions,CTE)和递归查询功能。CTE允许在SQL查询中定义临时的命名查询,并且可以在查询内部引用自身。以下是一个示例来演示如何编写递归SQL语句:假设有一个员工表employees,其中包含列id、name和manager_id,表示员工......
  • 递归和迭代的区别
    递归关键字是if-else深层的调用,一层一层进行执行函数的调用是这样的迭代关键字是forwhile是这样走的......
  • PostgreSQL(pg) /MYSQL数据库,使用递归查询(WITH RECURSIVE)功能来实现获取指定菜单ID的
      PostgreSQL/MYSQL数据库,使用递归查询(WITHRECURSIVE)功能来实现获取指定菜单ID的所有下级菜单数据。下方用例是假设菜单表menu的改成自己的表即可WITHRECURSIVEmenu_hierarchyAS(SELECTid,name,parent_idFROMmenuWHEREid=<指......
  • 递归生成表格动态表头
    <render-column:columnList="headList"></render-column><el-table-column><templatev-for="(item,index)incolumnList"><el-table-columnv-if="item.child&&item.child.length>0":......