算法分析之递归与分治策略

递归与分治策略

直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。
在计算机算法设计与分析中,使用递归技术往往使函数的定义和算法的描述简洁且易于理解。

例1 阶乘函数

可递归地定义为:
其中:
n=0 时,n!=1为边界条件
n>0 时,n!=n(n-1)!为递归方程
边界条件与递归方程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。

例2 Fibonacci数列
无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为:
第n个Fibonacci数可递归地计算如下:

int fibonacci(int n){
       if (n <= 1) return 1;
       return fibonacci(n-1)+fibonacci(n-2);
   }

递归需要有边界条件、递归前进段和递归返回段。
当边界条件不满足时,递归前进;
当边界条件满足时,递归返回。
注意:在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口,否则将无限进行下去(死锁)。
递归的缺点:
递归算法解题的运行效率较低。
在递归调用过程中,系统为每一层的返回点、局部变量等开辟了堆栈来存储。递归次数过多容易造成堆栈溢出等。

例3逆序输出一个正数中的每一位数

例如,对于数12345,依次输出5 4 3 2 1
分析: 如果n/10==0,则 输出n; 否则 输出n%10, 然后,对n/10进行相同处理

void Reverse( int n){
	if(n/10==0)
  		cout<<n;
  else{
		cout<<n%10;
		Reverse(n/10);
   }
}
main(){
    Reverse(12345);
}

顺序输出一个正数中的每一位数

例如,对于数12345,依次输出1 2 3 4 5

分析: 如果n/10==0,则 输出n; 否则 先对n/10进行相同处理之后,cout<<n%10;

void Reverse( int n){
	if(n/10==0)
  		cout<<n;
  else{
		Reverse(n/10);
		cout<<n%10;
   }
}
main(){
    Reverse(12345);
}

原文地址:https://www.cnblogs.com/khnl/p/11639258.html

时间: 2024-10-08 05:56:28

算法分析之递归与分治策略的相关文章

递归与分治策略(一)---算法设计与分析

递归与分治策略(一) 简而言之,递归就是自己调用自己. 递归算法:直接或者间接地调用自身的算法. 递归函数:用函数自身给出定义的函数. 注意:每个递归函数都必须有非递归定义的初始值,以确保递归函数完成计算. 下面通过两个例子来介绍递归的特点 例1 阶乘函数 阶乘函数递归地定义为: n!=1   (n=0) 或者 n!=n(n-1)!  (n>0) 下面用一段简单的Java代码实现 这里是递归实现: public static int facterial(int n) { if (n == 0)

计算机算法设计与分析之递归与分治策略——二分搜索技术

递归与分治策略 二分搜索技术 我们所熟知的二分搜索算法是运用分治策略的典型例子,针对这个算法,先给出一个简单的案例. 目的:给定已排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定的元素x. 我们首先想到的最简单的是用顺序搜索方法,逐个比较a[0:n-1]中元素,直至找出元素x或搜索遍整个数组后确定x不在其中.这个方法没有很好地利用n个元素已排好序的这个条件,因此在最坏的情况下,顺序搜索方法需要O(n)次比较. 而二分搜索方法充分利用了元素间的次序关系,采用分治策略,可在最坏情况下用

五大常见算法策略——递归与分治策略

摘要:递归与分治策略是五大常见算法策略之一,分治策略的思想就是分而治之,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的解.而分治与递归很多情况下都是一起结合使用的,能发挥出奇效(1+1>2),这篇文章我们将先从递归说起,再逐渐向分治过渡,主要讲解方式是通过9个例题来说明问题的,问题都是根据难度由简到难,由浅入深,对递归与分治能有个大概的了解雏形,当然最重要还是要做大量练习才能掌握. 1.递归 我们第一次接触递归一般都是在初学C语

第二章-递归与分治策略

第一题: 问题名称:整数划分问题. 问题描述:正整数n可以表示为一系列正整数之和:n = n1 + n2 + ... + nk (k>=1, n1>=n2>=nk ),则称这种表示为正整数n的划分,不同的这种表示的个数称为正整数n的划分数,记为p(n).在所有划分中,将最大加数n1不大于m的划分数,记为q(n,m). 问题分析: q(n, m) =  1 ,当n = 1,m = 1;   q(n,n) ,当n < m: 1 + q(n,n-1),当n = m: q(n,m-1) +

算法设计与分析笔记(一)递归与分治策略

一>递归:直接或间接地调用自身的算法. EG: 1>阶乘定义 n!=n(n-1)! (n>0); pubic static int factorial(int n ){ if(n==0) return 1; else return n*factorial(n-1); } 2>FiBonacci数列 public static int fibo(int n){ if(n<=1)return 1; else fibo(n-1)+fibo(n-2); } 3>排列问题(一个集

递归与分治策略

一. 基本思想 分治法的基本思想是,将一个难以直接解决的大问题,分割成一些规模较小的子问题,这些子问题互相独立且与原问题相同.递归地解这些子问题,然后将各子问题的解合并得到原问题的解.(分-治-合) 二. 适用条件 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决: 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质(当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质): 分解出的子问题的解可以合并为原问题的解: 分解出的

[图解算法] 线性时间选择——//递归与分治策略//【图解才是最直观】

1 #include <ctime> 2 #include <iostream> 3 using namespace std; 4 5 template <class Type> 6 void Swap(Type &x,Type &y); 7 8 inline int Random(int x, int y); 9 10 template <class Type> 11 void BubbleSort(Type a[],int p,int r

2.6 递归与分治策略(汉诺塔问题)

汉诺塔问题是一个经典问题. 题意理解:有A,B,C三个柱子,将A柱子上的N个盘子(从小到大排列)移到C柱子上,每次只允许移动一个盘子,并且保证每个柱子上的盘子的排列都是从小到大. 分析:由题意可知,如果要将A上的盘子移动到C,那么肯定需要借助C. 首先将A上的盘子从上到下依次编号为1-n. 运用整体思想: 1.假设1到n-1个盘子是一个整体 2.将1到n-1个盘子构成的整体移动到B 3.将第n个盘子移动到C 4.再将第2步移动到B的整体移动到C就可以了. 重复以上过程,显然这是一个递归的过程.下

2_3 递归与分治策略(二分搜索技术)

二分搜索算法是分支策略的典型应用,具体是在给定的有n个元素的已排序序列a中找出一个特定元素. 基本思想:将n个元素分为两半,取a[n/2]与x进行比较, 如果x<a[n/2],继续在数组a的左半部分搜索. 如果x>a[n/2],继续在数组a的右半部分搜索. (图片源自百度图片) 查找算法对比: 1.顺序搜索不能很好利用排序这个已知条件,而且是O(n)算法. 2.二分搜索充分利用排序条件,算法复杂度是O(log n). 上代码: public class a_2_3<T extends C