递归算法

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

递归(即递推与回归)

递归调用指的是该方法在执行的过程中遇到它自己本身的调用(即自己调用自己)

递归算法的两个条件:

  1:含有递归出口(结束条件)

  2:逐层递归向出口逼近

递归的思想:将一个大的事物分解成若干个小的事物且每一次使用的方法都相同


举例:

汉诺塔问题:

 如图所示, 从左到右有A、B、C三根柱子,其中A柱子上面有从小到大的n个圆盘,现要求将A柱子上的原盘移到C柱子上去。

 移动规则:

  一次只能移动一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

分析:

当A棒上只有一个盘子时,直接将这个盘子移到C棒上。

当A棒上有两个盘子时,先将A棒1号盘子(从上到下编号)移到B棒也就是辅助棒上,再将A棒上的2号盘子移到C棒上,最后将B棒上的盘子移到C棒上。

当A棒上有三个盘子时,先将A棒上编号1~2的两个盘子移到B棒上(这个过程需要借助C棒),然后再将A棒上编号为3的盘子移到C棒上,最后再借助A棒将B棒上的两个盘子移动到C棒上。

.....

当A棒上有n个盘子时,先将A棒上的前1~(n-1)个盘子移动到B棒上(需要借助C棒),然后再将A棒上编号为n的盘子移到C棒上,最后再借助A棒将B棒上的n-1个盘子移动到C棒上

综上所述:当且仅当只有一个盘子时不需要借助辅助棒,其余情况均一样

这时我们就可以采用递归算法来解决这个问题:

	/**
	 * 
	 * @param num :圆盘个数
	 * @param start  : 起始棒
	 * @param help : 辅助棒
	 * @param dest : 目标棒
	 */
	public static void hanoi(int num,char start,char help,char dest){
		if(num==1){     //当只有一个盘子时直接移动
			count++;
			System.out.println("第"+count+"次移动,从"+start+"棒移动到"+dest+"棒");
		}else{
			hanoi(num-1,start,dest,help); //借助C棒将n-1个圆盘移动到B棒上
			count++;
			System.out.println("第"+count+"次移动,从"+start+"棒移动到"+dest+"棒");
			hanoi(num-1,help,start,dest); 
		}
	}

}


递归算法递归算法的快速入门 本文主要介绍了递归的基本概念、应用场景和原则。 阅读详情

相关推荐

递归算法简介

递归算法 简单递归实例 递归算法的不足 递归不足的改进 python中的最大地柜深度 线性递归 二路递归 多重递归 设计递归算法 参数化递归 消除尾递归

weixin_54929649的博客 2517

【基本算法】【递归篇】取

题目:将n个不同的小球,放在m个相同的子上。要求每个子上都必须有小球,且满足0<m<n<=20。输出最后方法数。 分析:我们可以先考虑先放n-1个小球的情况,再放第n个小球。那么我们可以分成两种情况:1.第n个小球不单独在一个子上。2.第n个小球单独在一个子上。我们不妨用dep[n][m]代表将n个小球放在m个子上的方法数。 递归设计:由上可以得出递归表达式:dep[n][m]=dep[n-1][m]*m+dep[n-1][m] 同时它的递归出口应该是:n=m||m=1时。 ps

m0_61753365的博客 850

汉诺塔递归与非递归算法

1. 基本递归算法:原文:https://blog.csdn.net/hehe5229/article/details/60874167#include&lt;stdio.h&gt;   #include&lt;stdlib.h&gt;   int count=0;   void move(char getone, char putone) {       count++; printf("%c...

llanlianggui的博客 3588

【C语言】Hanoi(汉诺)塔问题,求移动子的步骤(递归法)

所有的循环算法都可以用递归实现,反之不成立,这足以证明递归的重要性! Hanoi(汉诺)塔问题。古代有一个焚塔,塔内有3个座A,B,C,开始时A座上有64个子,子大小不等,大的在上,小的在下,有一个老和尚想把这64个子从A座移到C座,但规定每次只允许移到一个,且在移动过程中在3个座上都始终保持大在下,小在上,在移动过程中可以利用B座。输出移动子的步骤。 解:由于64个子移动...

Alan的博客 4755

算法设计方法:递归的内涵与经典应用

大师说:To Iterate is Human, to Recurse, Divine.毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。本文剖析了递归的思想内涵并分析了阶乘、斐波那契数列、汉诺塔、杨辉三角的存取、字符串回文判断、字符串全排列、二分查找、树的深度求解等八个问题。

Rico's Blogs 3万+

递归算法讲解

一. 引子   大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。在正式介绍递归之前,我们首先引用...

有趣的人生 一半是山川湖海 一半是初心情怀 6702

动态规划与递归算法 M苹果放N

动态规划与递归算法 M苹果放N

whing123的博客 3500

Ackerman的递归与非递归算法

已知Ackerman函数的定义如下: akm(m,n)=⎧⎩⎨n+1,akm(m−1,1),akm(m−1,akm(m,n−1)),m = 0m≠0,n=0m≠0,n≠0akm(m,n)= \begin{cases} n+1, & \text{m = 0} \\ akm(m-1,1),& m \neq 0, \, n = 0 \\ akm(m-1,akm(m,n-1)),& m \ne

sanqima的专栏 1万+

递归算法与非递归算法比较

转载自:https://blog.csdn.net/mhsszm/article/details/78445591 非递归效率高;递归代码写出来思路清晰,可读性强。 生成可执行文件大小应该和编译器有关吧。。。。 递归的话函数调用是有开销的,而且递归的次数受堆栈大小的限制。 以二叉树搜索为例: bool search(btree* p, int v) { if (null ...

u013073067的博客 1万+

递归算法转换为非递归算法

转 自 : https://blog.csdn.net/fbz123456/article/details/50959412 递归算法实际上是一种分而治之的方法,它把复杂问题分解为简单问题来求解。对于某些复杂问题(例如hanio塔问题),递归算法是一种自然且合乎逻辑的解决问题的方式,但是递归算法的执行效率通常比较差。因此,在求解某些问题时,常采用递归算法来分析问题,用非递归算法来求解问题...

qq_38446366的博客 1万+

递归与非递归算法

一、原因:递归算法一般效率更低;有些程序语言不支持递归。 二、方法:将递归算法转换为非递归算法有两种方法,一种是直接求值,不需要回溯;另一种是不能直接求值,需要回溯。前者使用一些变量保存中间结果,称为直接转换法;后者使用栈保存中间结果,称为间接转换法,下面分别讨论这两种方法。 直接转换法 直接转换法通常用来消除尾递归和单向递归,将递归结构用循环结构来替代。 尾递归是指在递归算法中,递归调用语句只有一个,而且是处在算法的最后。例如求阶乘的递归算法: long fact(int n) {   if(n0)

qq_44650782的博客 3352

递归算法与非递归算法区别和转换

package com.wangpos.datastructure.sort; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import com.wangpos.datastru...

qq_35711549的博客 3249

递归算法及经典递归实现

递归 递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 递归: 在定义自身的同时又出现了对自身的调用 直接递归函数: 在定义函数体中直接调用自己 间接递归函数: 一个函数经过一系列中间调用语句,通过其他函数调用自己,如P调用Q,Q再调用P 使用 递归算法的 前提有两个: (1) 原问题可以层层分解为类似的子问题,且子问题比原问...

子非鱼的博客 3225

递归算法总结

递归讲解

jzoj_ylz的博客 1623
上一篇: Java中方法的声明与调用
下一篇: 数组
maoxin0915
博客等级 码龄9年 5粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值