`
sunqing0316
  • 浏览: 41962 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

算法——递归

 
阅读更多

概念

程序调用自身的编程技巧称为递归( recursion)。在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

注意

(1) 递归就是在过程或函数里调用自身;
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3)在递归调用的过程当中,系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。

递归应用

递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)

举例

德罗斯特效应是递归的一种视觉形式。

应用程序举例:

阶乘

<span style="font-size:18px;">public class testRecursion{
		public static void main(String [] args){
				System.out.println(method(10));
			}
		public static int method(int n){
				if (n==1){
						return 1;
					}
				else{
						return n*method(n-1);
					}
			}
	}</span>

运行结果:
3628800

斐波纳契数列(Fibonacci Sequence)是典型的递归案例,又称黄金分割数列,1、1、2、3、5、8······,接下来让我们求第20个数的值

<span style="font-size:18px;">public class testFab{
		public static void main(String [] args){
				System.out.println(f(20));
			}
		public static int f(int n){
				if (n==1||n==2){
						return 1;
					}
				else{
						return f(n-1)+f(n-2);
					}
			}
	}</span>


运行结果:

6765

递归的优缺点

优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法和调试程序带来很大方便。
缺点:递归算法解题运行效率较低,无论是耗费的计算时间还是占用的存储空间都比其他算法要多,尽管有许多数学函数均可以递归表示,但在实际应用中,递归定义的高开销往往会让人望而却步。因此,应该尽量避免使用递归,除非没有更好的算法或者在某种特定情况下递归更为适合的时候。

总结

递归算法就是一个函数通过不断对自己的调用而求得最终结果的一种思维巧妙但是开销很大的算法。递归的底层实现其实是一个栈。栈的特点是后进先出,也就是最后进入栈的事件是最先被处理的。它就像一个黑盒子,可以给我们最终的输出结果,却不用知道其内部到底经历了怎样的一个计算过程,其内部就是一个不断分解的过程,将一个复杂的计算不断拆分,变成一个嵌套一个的相同的小零件,这样可以让人很明白的理解计算的过程。

分享到:
评论

相关推荐

    算法思想——递归与分治

    算法思想——递归与分治 递归和分治是两种常用的算法思想,它们可以单独使用,也可以结合使用以解决复杂的问题。下面我们将详细探讨这两种算法思想。 递归是一种算法思想,它的基本思想是将一个问题分解成一个或多...

    算法思想——递归与分治.ppt

    递归与分治是计算机科学中两种重要的算法思想,它们在解决复杂问题时起到了关键作用。递归是一种方法,通过函数或程序直接或间接调用自身来解决问题。递归通常包含两个基本要素:边界条件和递归方程。边界条件是递归...

    老师多年积累,很详细全面的算法讲解——递归,分治

    在计算机科学中,递归与分治是两种重要的算法设计策略。它们在解决复杂问题时,能够将大问题分解为小问题,通过解决小问题来推导出大问题的解。接下来,我们将深入探讨这两种方法。 首先,递归是一种函数或程序调用...

    C语言——递归算法

    C语言中递归是重中之重的部分,多数用于求解N!等含有迭代性质的问题,此文档详细介绍了递归算法,实用。

    递归算法——STL

    **递归算法与STL在C++中的应用** 递归算法是编程中一种重要的思想,它通过函数调用自身来解决问题。在C++中,递归可以与标准模板库(STL)结合,以实现更高效、简洁的代码。本文将深入探讨递归算法的应用,特别是...

    全排列——递归排序和字典序列

    ### 全排列——递归排序和字典序列 在计算机科学与编程领域中,全排列是一种重要的算法,它被广泛应用于解决多种问题,如组合优化、密码学等。本文将详细介绍两种实现全排列的方法:递归排列和字典序排列,并通过...

    c语言分治法求众数重数-五大常见算法策略之——递归与分治策略,算法数据结构

    以下我们将探讨几种基于递归和分治策略的算法,包括Fibonacci数列、阶乘计算和小青蛙跳台阶问题。 首先,Fibonacci数列是递归的一个经典例子。递归定义了一个数列,其中每个数是前两个数的和。在C语言中,我们可以...

    RSA基本递归算法——实验用

    RSA基本递归算法,简单,基本,快速,大模运算的基本方法

    N皇后求解问题——递归和回溯方法

    这个问题常用于演示回溯算法和递归在解决约束满足问题中的应用。 首先,我们来探讨递归方法。在C语言中,递归是一种函数调用自身的技术。对于N皇后问题,我们可以定义一个递归函数,该函数尝试在当前行放置皇后,并...

    java算法——汉诺塔经典的递归

    汉诺塔——经典的递归 *实现移动函数 *递归实现汉诺塔函数

    c++编写二叉树遍历(前中后序——递归与非递归)

    本主题主要探讨的是在C++中如何实现二叉树的前序、中序和后序遍历,同时包括递归和非递归两种方法。VS2008是Microsoft Visual Studio的一个版本,它提供了一个强大的开发环境,支持C++编程。 **前序遍历**: 前序...

    前端开发——递归函数.docx

    递归函数在处理树形结构、分治算法(如快速排序、归并排序)、深度优先搜索等问题时特别有用。然而,由于每次函数调用都会产生额外的内存开销(用于保存调用栈信息),因此需要注意控制递归深度,避免栈溢出。在某些...

    八皇后问题——递归解决

    用递归解决八皇后问题的一段代码,专门写了较为详细的注释,本人原创,如有雷同,纯属巧合。

    算法图解——递归

    递归 函数自己调用自己 在用递归的同时,也可以用while循环实现 递归只是让解决方案更加清晰,并没有性能上的优势,有时候甚至循环的性能更好 “如果使用循环,程序性能可能更高;如果使用递归,程序可能更容易理解...

    《Java数据结构和算法》学习笔记(5)——递归 归并排序

    在本篇《Java数据结构和算法》学习笔记中,我们将深入探讨递归和归并排序。递归是一种强大的编程技术,常用于解决复杂问题,而归并排序则是利用递归实现的一种高效排序算法。 首先,让我们理解什么是递归。递归是...

    结构化程序(回溯法,递归,贪心法,动态规划)

    综上所述,结构化程序设计方法及其相关算法——递归、回溯、贪心和动态规划——为我们提供了一个强大而灵活的框架,以解决从简单的编程任务到复杂的计算问题。通过深入理解这些方法,并掌握它们在实际中的应用,我们...

    计算机算法——设计与分析导论(第三版)影印版

    《计算机算法——设计与分析导论》是计算机科学领域中一本经典的教材,主要涵盖了算法设计的基本原理、分析方法以及实际应用。第三版的更新通常会包含新的研究成果、改进的教学方式和更多的实例,以适应不断发展的...

    数据结构与算法——C++版(第3版)源文件

    在《数据结构与算法——C++版(第3版)》中,作者深入浅出地介绍了这些核心概念,并提供了源代码以供学习和实践。 本书可能涵盖了以下几个重要的知识领域: 1. **基础数据结构**:首先,书中会介绍基本的数据结构,...

    算法——分治算法原理

    **分治算法**是一种在计算机科学中广泛应用的解决问题的策略,尤其在算法设计领域具有重要地位。它的核心理念是将复杂的问题分解成多个相似的、更小规模的子问题,然后对子问题进行求解,最后将子问题的解合并以获得...

Global site tag (gtag.js) - Google Analytics