递归再一次让哥震惊了
先说那两个让哥震惊的递归问题:
1:用递归实现单链表的倒序输出
2:从二插查找树中删除节点,并保证还是二插查找树
同学们可以开始思考这两个问题了,当然你可能N年前就遇到过这两个问题,那么不妨看看,看你是否真的理解了递归。实现这两个问题的代码当然很简单,就在下面。
百度百科中递归的名片:递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象.递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写程序能使程序变得简洁和清晰。
刚开始学习的递归的时候,觉得他好强大,实现某些功能不用递归可能要几十行代码,用递归可能几行就搞定了,而且代码清晰简洁。一直以为递归也就是自己调用自己,有一个出口条件,让他停止递归,退出函数,其实的特点并非就这些。
递归还有一个非常重要的特点:先进后出,跟栈类似,先递进去的后递出来。由于递归一直在自己调用自己,有时候我们很难清楚的看出,他的返回值到底是哪个,只要你理解了先进后出这个特点,你就会明白,第一次调用时,作为返回值的那个变量的值就是递归函数的返回值。先进后出吗,他是第一个进来,也就是最后出去的那个,当然就是递归的返回值啦。
第一个让哥震惊的问题:用递归实现单链表的倒序输出。
我前段时间写过一篇博客《四种方式实现--从尾到头输出链表》,其中一种方法就是用递归实现的,当时看见那位高人用递归实现了这个功能,哥被震住了,他怎么可以这么聪明,他的博客真的是学算法的好地方:http://zhedahht.blog.163.com/blog/#m=0。代码如下,这是我那篇博客的源码:
最近在博客园中看的一些博客,发现有几篇文章跟树联系得比较紧,前天晚上,我于是把数据结构与算法中树的那一章温习了一下,哥被二插查找树删除节点的算法给震住了,因为我以前也写过一篇关于二插查找树的博客《算法学习--二叉查找树》,在这篇博客中,删除节点的那个算法写得很长,以至于叫我自己现在去看都不是很理解,今天会让大家看到看到简洁清晰的代码,递归写的吗,哈哈哈!
先来C++版的吧,好久没写了,都生疏了:
在来C#版:
这里的重点是怎么处理,被删除的那个节点有左右两棵子树,其他的都很好处理,处理方式是:
1:找到要删除节点的右子树的最小节点,用FindMin这个方法就可以搞定;
2:将右子树的最小节点取代当前删除的节点,因为右子树的最小节点比当前节点的左子树中的所有节点都大,比右子树的节点都小,它就是符合条件的那个节点来代替当前要删除的节点
3:由于右子树的最小节点取代了当前节点,所以要在右子树中删除这个最小节点,现在又转换成同一个问题,在一棵二插查找树中删除一个节点,于是就递归咯。
我当时就是没有想到这里还可以用递归,写了一堆自己现在都不是很懂的代码。
第一个问题让我震惊是以前没有理解递归的先进后出的思想,第二个是因为我没有掌握问题转换的思想,看似两个不同的问题,其实是同一个问题,当然解法也是一样的,既然把两个解法一样的问题放在一起,用递归就再好不过了,他同时把你们搞定
作者:陈太汉
博客:http://www.cnblogs.com/hlxs/
分享到:
相关推荐
c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘...
C#递归C#递归C#递归C#递归C#递归C#递归C#递归C#递归C#递归
宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归
文件递归-XML递归-树图递归 面试中的常见递归算法:附带截图和详细代码
3.使用递归 先序遍历一棵二叉树 4.使用递归 中序遍历一棵二叉树 5.使用递归 后序遍历一棵二叉树 6.使用非递归 先序遍历一棵二叉树 7.使用非递归 中序遍历一棵二叉树 8.使用非递归 后序遍历一棵二叉树 PS:代码为C++...
.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法
在程序设计中,数据描述和算法表达也常用递归,通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的...
C语言使用递归创建一颗平衡二叉树的源代码文件
二叉树递归与非递归遍历
递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树...
包含多个经典的递归应用代码: 1.fibonacci.c 是斐波拉契数列递归解法 2.hanoi.c 是汉诺塔递归算法 3.permutation.c 是全排列递归算法 4.queen.c 是八皇后递归算法 5. reverse.c 是递归的测试代码 6.strlrn.c 是求...
快速选择非递归与递归算法实现
递归和非递归方式计算Ackerman函数。非递归方法用堆栈实现。代码内部有详细的注释说明,比较适于学习。
递归算法详解递归算法详解递归算法详解递归算法详解
一维信号生成对应递归图,用于分类,识别,特征提取
省市县递归函数
ackman函数的递归和非递归,学习数据结构的素材,非递归是使用堆栈实现的。
c++实现的合并排序算法 用递归和非递归两种方式实现的
通过递归方法构建树形结构数据,比如无限层级菜单,可供新手学习递归算法
Fibonacci数列的java实现,包括递归与非递归实现