`
风子柒
  • 浏览: 56383 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

镜子:递归的学习

阅读更多
   很久没有写技术博客了。
  
   最近发现,递归是一个很有用的东西,在有些情况下可以大大提高程序的效率,但是在某些情况(比如某些计数实现时)会好用大量的时间和空间,甚至可能导致系统崩溃。但是,它无可否认是一个很强大的问题解决技术。比如,我们在建立一个二叉树时,就用到了递归的思想。
   
   有人说过,递归就像两面相对放置的镜子,我们可以在一面镜子中看到另一面镜子的镜像,而且镜像在逐步变小。这也就意味着,我们在解决问题时,可以一样地大化小,小化无。我们在使用递归时,一般都是找一个base case作为递归的基例,然后再逐渐让程序往base case上靠拢。
   下面直接上例子吧。

/**
* Output 1 ~ n.
* @param n
*/
public static void output(int n){

// base case
if(n == 1){

System.out.printf("%d ", n);

} // end if

// recurse
if(n > 1){

System.out.printf("%d ", n);
output(n - 1);

} // end if

} // end output
    这是一个很简单的递归调用,用来实现一串数字的打印。其中,基例(base case)就是n==1的情况,以后的每一次的调用,都逐渐向着这一目标有规律地靠近。当然,这个问题可以用迭代的方法来实现,这里只是用以说明递归而已。下面的一个例子也是一个比较简单的递归实现:

/**
* Calculate and return.
* @param x
* @param n
* @return
*/
public static int calc(int x, int n){

// count the times of recursion
count ++;

// base case
if(n == 0){

return 1;

} // end if

// recurse
if(n > 0){

return x * calc(x, n - 1);

} // end if

return 0;

} // end calc
    这个程序片段完成的功能是递归实现计算x的n次幂。相当于power函数的功能。笔者昨天写了两种递归、一种迭代对此功能进行测试。发现在处理类似问题上,迭代和递归的效率还是差不多的。但是有些问题比如著名的汉诺塔问题基本就是只能用递归了。
    也就是在前天,学校举行的ACM网络赛有一道牛繁殖的问题(类似兔子繁殖问题),我最开始的反应也是用递归实现,而且用C在20行就解决了,代码就略了(前天忘了拷贝回来了,而且类似的代码不少),但是submit时一直不成功,原因很简单:超时了!!后来我测试一下比较大的数,还真的几十秒才出来,太大的话就干脆不出来了!!所以,用递归实现类似的计数类得问题,建议还是首选迭代吧。
   
    好吧!到此说声晚安吧!明天早上8点还得去集训呢!!
    加油加油!!!
  • 大小: 110.4 KB
0
3
分享到:
评论

相关推荐

    5·5递归算法,递归思想

    这种解决问题的方式就像照镜子一样,每个小问题都是大问题的一个缩影,通过不断的自我调用来达到求解的目的。 在Java中,递归通常涉及到以下几个核心概念: 1. **基础情况(Base Case)**:这是递归算法的终点,一...

    VB函数递归与调用PPT学习教案.pptx

    这就像镜子A和镜子B的反射现象,形成一个无限循环的链。 递归算法有其独特的特点: - 执行过程分为递推和回归两个阶段。递推阶段函数不断调用自身,直到达到预设的结束条件,然后进入回归阶段,逐层返回结果。 - ...

    国外数据结构教程C++版

    书中将递归比喻为镜子反射,每次反射都会让图像变得更小,直到消失,类似于递归调用最终会终止的情况。 - **问题求解技巧**:除了递归,本书还介绍了多种其他有效的编程和问题解决技巧,如迭代、贪心算法、分治法...

    Data+Abstraction+and+Problem+Solving+with+C+++3+Ed

    递归则是一种迭代技术,通过解决相同类型但规模较小的问题来解决更复杂的问题,这与镜子中的影像不断缩小反射相似。 为了确保学生能够理解和掌握书中的概念,作者们注重清晰的表述,考虑到他们自己作为前大学生以及...

    《数据结构》课程融入研究性教学理念探究.pdf

    4. 教学内容与案例结合:文章提出将教学案例与教学内容相结合的教学方式,例如通过“去图书馆如何占座”讲解不同的存储方法,通过“去理发店照镜子”讲解递归问题等,以生活中的实际问题作为案例,帮助学生更好地...

    微软经典测试题,发散思维

    14. 镜子问题:这个问题考察了物理学和推理能力,需要解释为什么镜子中的影象可以颠倒左右,却不能颠倒上下。 知识点:物理学、推理能力 15. 热水问题:这个问题考察了物理学和推理能力,需要解释为什么在任何旅馆...

    形象类比法在C语言函数教学中的运用.pdf

    同样,递归函数的每次调用都会产生一个新的“镜子”,直到达到某个终止条件,就像镜子的反射最终会停止。 通过形象类比法,将C语言函数的抽象概念与日常生活中的实例相结合,可以极大地提升学生的学习兴趣和理解...

    微软经典测试题及详细参考答案

    10. **学习策略**:新语言学习,强调系统性学习和实践应用。 11. **目标设定**:奖励动机与观众分析,涉及个人职业规划。 12. **商业计划**:投资计划,需要考虑市场需求、竞争环境和盈利模式。 13. **行业规范**:...

    研究性教学在《数据结构》课程中的探究与实践.pdf

    案例教学的具体做法包括在教学各章节引入时,挑选恰当的日常生活中案例,如通过“两个朋友共同租用房屋承担费用”讲述两栈共享空间的问题,通过“去理发店照两面相对的镜子”说明递归概念,以及通过“电文的编码译码...

    LeetCode:LeetCode问题的解决方案

    2. **镜子**: 这个标签可能指的是镜像问题,例如镜像二叉树或镜像字符串。镜像二叉树的左右子树互换,而镜像字符串则是关于中心轴对称的。在LeetCode中,这类问题通常涉及递归或层次遍历的解决方案。Java的`java....

    GPU高性能编程CUDA实战代码

    7. **CUDA C++编程技巧**:包括如何使用模板、动态分配内存、递归以及异步计算等高级特性,这些都可能在CUDA编程中派上用场。 通过《GPU高性能编程CUDA实战》提供的源码,读者可以实践书中介绍的案例,加深对CUDA...

    infinity-mirrors

    递归函数可以模拟镜子间的无限反射,而循环则可以处理连续的帧更新,确保动画流畅。 5. **性能优化**:由于实时渲染需要高效的计算能力,开发者可能会关注代码优化,比如避免不必要的计算,使用缓存技术,或者利用...

    C#左侧导航菜单

    在C#中,我们可以使用类(如`MenuItem`)来表示菜单项,并通过递归方式构建整个菜单树。 在描述中提到的"实例演示"可能是指一个实际的代码示例。在C#中,这可能包括以下几个步骤: 1. **定义MenuItem类**:创建一...

    PHP实现判断二叉树是否对称的方法

    对称二叉树是这样一个特殊的二叉树,它的形状像一面镜子,即对于树中的每个节点,其左子树和右子树都是互为镜像的。本篇文章将深入探讨如何使用PHP实现判断二叉树是否对称的方法。 首先,我们需要定义一个二叉树...

Global site tag (gtag.js) - Google Analytics