`

分享下以前做过的递归题目

阅读更多
1. 递归算法解题步骤

(1) 分析问题、寻找递归关系。找出大规模问题和小规模问题的关系。
(2) 找出停止条件,控制递归。
(3) 设计函数、确定参数。

2. 问题描述:
   整数的分划问题。

   如,对于正整数n=6,可以分划为:
   6
   5+1
   4+2, 4+1+1
   3+3, 3+2+1, 3+1+1+1
   2+2+2, 2+2+1+1, 2+1+1+1+1
   1+1+1+1+1+1+1

   现在的问题是,对于给定的正整数n,编写算法计算出其分划得数目。

3. 问题分析和递归关系建立

   从上面n=6的实际例子可以看出,很难找到大规模问题P(n)和小规模问题P(n-d)(d=1或2或3...)的关系。
根据n=6的实例发现"第一行及以后的数据不超过6,第二行及以后的数据不超过5...,第六行的数据不超过1"。
   因此,定义一个函数Q(n,m),表示整数n的"任何加数都不超过m"的分划得数目,n的所有分划数目P(n)就应该
表示为Q(n,n).

   一般地,Q(n,m)有以下递归关系:
   (1) Q(n,n) = 1+Q(n,n-1);
   (2) Q(n,m) = Q(n,m-1) + Q(n-m,m) (m<n)
       Q(n,m-1)表示被加数中不包含m的分划数目;
        Q(n-m,m) 表式被加数中包含m的分划数目。

4. java实现:
/**
 * create on 2010.05.21 TODO:递归
 * 
 * @author 毛正吉
 * @version v1.0
 * 
 */
public class IntegerDivision {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		IntegerDivision id = new IntegerDivision(6);
		int count = id.divInteger(id.getN(), id.getN());
		System.out.println(count);

	}

	private int n;

	public IntegerDivision(int _n) {
		n = _n;
	}

	/**
	 * 递归求解
	 * 
	 * @param n
	 * @param m
	 * @return
	 */
	public int divInteger(int n, int m) {
		if (n < 1 || m < 1) {
			System.out.println("输出参数错误!");
		} else if (n == 1 || m == 1) {
			return 1;
		} else if (n < m) {
			return divInteger(n, n);
		} else if (n == m) {
			return divInteger(n, n - 1) + 1;
		} else {
			return divInteger(n, m - 1) + divInteger(n - m, m);
		}
		return 0;
	}

	public int getN() {
		return n;
	}

	public void setN(int n) {
		this.n = n;
	}

}

  
分享到:
评论
6 楼 maozj 2010-05-24  
fuliang 写道
简单修改楼主的代码成动态规划实现:
public class DivisionNum {
	private int cache[][];
	private int n;
	
	public DivisionNum(int n){
		this.n =  n;
		this.cache = new int[n+1][n+1];
	}
	
	public static void main(String[] args) {
		int n = Integer.parseInt(args[0]);
		DivisionNum dn = new DivisionNum(n);
		int num = dn.divisionNum();
		System.out.println("Division partition number: " + num);
	}
	
	public int divisionNum(){
		return this.divisionNum(n,n);
	}

	private  int divisionNum(int n,int m){
		assert(n > 0 && m > 0);
		
		if(n == 1 || m == 1)
			return 1;
		if(cache[n][m] != 0){
			return cache[n][m];
		}else if(n < m){
             cache[n][n] = divisionNum(n,n);
			return cache[n][n];
		}else if(n == m){
            cache[n][n-1] = divisionNum(n,n-1);
			return  cache[n][n-1] + 1;
		}else{
            cache[n][m-1] = divisionNum(n,m-1);
            cache[n-m][m] = divisionNum(n-m,m);
			return cache[n][m-1] + cache[n-m][m];
		}
	}
}

ok... 分享
5 楼 fuliang 2010-05-24  
简单修改楼主的代码成动态规划实现:
public class DivisionNum {
	private int cache[][];
	private int n;
	
	public DivisionNum(int n){
		this.n =  n;
		this.cache = new int[n+1][n+1];
	}
	
	public static void main(String[] args) {
		int n = Integer.parseInt(args[0]);
		DivisionNum dn = new DivisionNum(n);
		int num = dn.divisionNum();
		System.out.println("Division partition number: " + num);
	}
	
	public int divisionNum(){
		return this.divisionNum(n,n);
	}

	private  int divisionNum(int n,int m){
		assert(n > 0 && m > 0);
		
		if(n == 1 || m == 1)
			return 1;
		if(cache[n][m] != 0){
			return cache[n][m];
		}else if(n < m){
             cache[n][n] = divisionNum(n,n);
			return cache[n][n];
		}else if(n == m){
            cache[n][n-1] = divisionNum(n,n-1);
			return  cache[n][n-1] + 1;
		}else{
            cache[n][m-1] = divisionNum(n,m-1);
            cache[n-m][m] = divisionNum(n-m,m);
			return cache[n][m-1] + cache[n-m][m];
		}
	}
}
4 楼 maozj 2010-05-24  
mccxj 写道
动态规划算法~~~用递归效率很差劲~

恩 如果可以用动态规划算法实现 可以期待一下。。。
3 楼 mccxj 2010-05-23  
动态规划算法~~~用递归效率很差劲~
2 楼 whaosoft 2010-05-22  
gundumw100 写道
那么,这个可以用在什么地方呢?

估计是做个小练习 要不就是面试题
1 楼 gundumw100 2010-05-22  
那么,这个可以用在什么地方呢?

相关推荐

    C++ 递归经典题目全套源代码, 部分含注解.zip

    本压缩包包含了一系列使用C++实现的递归经典题目,旨在帮助学习者深入理解和运用递归。 1. **自然数拆分.cpp**: 这个题目要求将一个自然数拆分成若干个正整数的和,所有可能的拆分情况都要被列出。递归在这里用于...

    JAVA编程(递归典型题目)

    ### JAVA编程:递归典型题目解析 在计算机科学中,递归是一种强大的编程技术,它允许函数调用自身来解决问题。本文将详细解析几个典型的JAVA编程递归题目,包括阶乘计算、摘桃子问题、斐波那契数列以及汉诺塔问题,...

    c++递归/递推经典题目

    这里是本蒟蒻整理/写的递归递推经典题目 上传供大家学习使用 包含:过河卒、过河卒升级版、汉诺塔、级数求和、勒让德多项式、流感传染、判断回文、判断元素是否存在、平方根级数、平面分割升级版、全排列递归版、...

    递归算法的运用 经典题目

    好多递归经典题目 比如捕鱼问题 还有运动会金牌问题

    C#递归题目实例代码

    本例中的“C#递归题目实例代码”旨在展示如何利用递归解决斐波那契数列的问题。斐波那契数列是一组数,其中每个数字是前两个数字的和,起始于0和1。数列的前几项为0, 1, 1, 2, 3, 5, 8, 13, 21, 34等。 递归函数`...

    宏递归宏递归宏递归宏递归

    宏递归是编程语言中的一种技术,特别是在C和C++等预处理器强大的语言中常见,它涉及到宏定义的自我调用。宏递归允许程序员在编译时实现类似函数调用的逻辑,但这种方式并不受运行时环境的支持,而是由预处理器在编译...

    c++递归c++递归c++递归

    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#递归基础 #### 什么是递归? 递归是一种编程技术,它允许一个方法或函数直接或间接地调用自身...

    杭电ACM 题目分类 不完全 记录搜索,递归求解

    根据给定的信息,本文将对杭电ACM题目中的搜索与递归求解知识点进行详细的解析,特别是针对题目编号为1010、1016、1026、1043(双广)、1044(BFS+DFS)等题目进行深入分析,并涵盖其他相关的知识点。 ### 搜索技术...

    acm递归算法总结竞赛

    10. **注意事项**:递归可能导致栈溢出,尤其是在没有正确设置终止条件或者问题规模过大的情况下。在编写递归代码时,应确保理解递归调用的过程,并对递归深度有所控制。 通过学习“acm递归算法总结”,参赛者可以...

    经典递归转化为非递归

    经典递归转化为非递归 递归是编程中的一种常见技术,通过函数调用自身来解决问题。但是,递归也存在一些问题,如栈溢出、效率不高等。因此,了解如何将递归转化为非递归是非常重要的。下面我们将讨论递归的本质、尾...

    .net 递归算法 .net 递归算法.net 递归算法

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    递归向下分析器.rar

    递归向下分析器,也称为自顶向下解析器,遵循自上而下的策略来解析输入的源代码,尝试将它分解成可理解的语法结构。 词法分析,又称扫描,是将源代码文本转换为一系列有意义的符号,即词法单元(token)。这些词法...

    C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

    分享给大家供大家参考,具体如下: /*求二叉树叶子节点个数 -- 采用递归和非递归方法 经调试可运行源码及分析如下: ***/ #include #include #include using std::cout; using std::cin; using std::endl; using...

    递归算法与非递归转化

    递归算法与非递归转化 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。递归的效率一般不高,但是递归比较符合人类的思维方式。一般而言非递归算法更有效;但很多...

    5.6 递归思想和递归函数1

    在题目中提到的第一点,如果递归函数没有递归结束的语句,即没有定义基本情况,那么函数会不断地调用自身而无法停止,导致无穷递归,最终可能引发“栈溢出”错误,也就是我们常说的“死循环”。因此,编写递归函数时...

    可并行递归算法的递归多线程实现

    ### 可并行递归算法的递归多线程实现:深入解析 #### 引言:多线程与并行处理的重要性 随着计算任务日益复杂,传统的单线程编程模型已无法满足高效处理大规模数据的需求。多线程编程作为一种提高程序并发性和性能...

    递归算法详解递归算法详解

    - 深度过大的递归可能导致栈溢出,因此在编写递归函数时,需要确保存在有效的退出条件,防止无限递归。 综上所述,递归算法是解决问题的一种强大工具,尤其适合处理具有自相似性质的问题。理解和掌握递归原理和...

    递归教程 全套讲解

    - **效率问题**:由于递归涉及多次函数调用,相比于迭代,递归在某些情况下可能效率较低。 为了优化递归,可以采用以下策略: 1. **尾递归**:如果递归调用是函数的最后一个操作,并且返回值直接传递给调用者,那么...

    读懂C++递归程序

    这样做有助于我们理解递归函数是如何一层层向下进入递归,又如何一层层返回的。 掌握递归的关键 掌握递归对于计算机科学的学生来说至关重要。递归不仅仅是C++语言中的一个特性,它是一种解决问题的思维方式,广泛...

Global site tag (gtag.js) - Google Analytics