趣谈递归算法

2024-08-21 15:48
文章标签 算法 递归 趣谈

本文主要是介绍趣谈递归算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  记得之前小罗师傅给我写过一个有趣的VBS程序,代码就不说了,它讲的是一个有趣的小故事:“山上有座庙,庙里有个老和尚很爱跟人家讲故事,故事是这样的:山上有座庙,庙里有个老和尚很爱跟人家讲故事,故事是这样的...”你一定凌乱了:这老和尚是什么鬼!!总是一直重复自己说的话呢???



[自拍也是递归哟]

一、什么是递归调用


  哈哈,一个小玩笑,引出递归的定义,程序调用自身的编程技巧就是递归。当然不是无限的死循环啦!!看了本Java的书,发现在三大控制结构这章,多了一节递归。开始还在想,为什么作者要这样编写这本书,敲了一个小例子跟“当循环”一对比才发现啊,递归是一种特殊的循环。


二、递归的基本思想


  递归被发明出来是解决什么问题的呢?当需要解决一个很复杂的问题的时候,需要我们把这个大的问题化解为类似的几个小问题,直到问题简单到可以直接求解。其中需要注意的是,要有两点条件需要满足才能形成递归:

一是,保证函数中需要调用到自身;

二是,要有一个递归出口,即当满足一定条件的时候,有一个明确的结束。(return)

作用:少量的程序去解决重复的计算,大大减少了代码量。



三、例子分析(递归就是循环)


  先来说一个Fibonacci函数(数列从第三项开始,每个都是前两个的和):1,1,2,3,5,8.......


public class Test2{public static void main(String arg[]){System.out.println(f(5));}public static int f(int n){if(n==1||n==2){return 1;}else {return f(n-1)+f(n-2);}}}

结果:



递归过程:



  看到了上面的图,是不是很容易就理解了5是怎么得来的。这样如果问你复杂的100,1000,10000通过一个F(),也可以很容易推算出来了。看到上面的代码获取你会发现IF 下的语句就是递归出口,当满足括号中的条件时就可以跳出递归,否则(ELSE)就一直执行自己。这里括号中的作用就是While的作用。所以,我觉得可以把递归看出一种特殊的循环。



四、汉诺塔下的递归算法


  不知道大家有没有玩过下面这个游戏。有三根柱子a,b,c(从左向右依次命名),a柱子上有3个盘子,从小到大依次叠放,要求把a上的盘子都移到c上,b可以作为临时存放,移动的时候必须始终遵循小盘子在大盘子上面,且所有的塔只能从下而上依次变小,小盘子不能罗在大的下面。这就是经典的汉诺塔游戏。



代码实现:

public class HanoiTest {static int step = 0;/*** @param args*/public static void main(String[] args) {hanioSort(3, "A", "B", "C");}/*** 递归函数,用来遍历hanoi步骤*@param num 是盘子的编号,第1,2,3个盘子*@param a\b\c是塔名,指A,B,C塔*/public static void hanioSort(int num ,String a ,String b ,String c){if(num == 1){move(num,a,c);} else{hanioSort(num-1, a, c, b);move(num,a,c);hanioSort(num-1, b, a, c);}}public static void move(int num ,String a,String b){step ++ ;System.out.println("第"+step+"步,盘子"+num+"从"+a+"塔移到"+b+"塔\n");}
}


结果:





五、小结


  通过上面的例子相信你对递归也有一定的了解了,其实在VB学习的时候就用循环实现过Fibonacci函数的例子,在C++学习的时候也学过汉诺塔的例子。当时没有搞懂,只是停留在看的阶段,原来是我还没遇到递归算法啊!哈哈。



这篇关于趣谈递归算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093596

相关文章

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1