- 浏览: 324906 次
- 性别:
- 来自: 西宁
文章分类
- 全部博客 (120)
- Java Thought (29)
- Java Pattern (4)
- Data Base (7)
- Algorithm Design (33)
- Linux (0)
- Mysql (2)
- Oracle (0)
- ConstructionDesign-架构 (5)
- Spring Platform (0)
- Tomcat (1)
- JavaScript (7)
- Web System (3)
- MS SQLServer (1)
- 软件哲学 (6)
- View (3)
- Java GUI (4)
- CSSDIV (7)
- CloudComputing (0)
- WebService (0)
- SystemOrProject (2)
- SOA (0)
- 互转共享 (3)
- 偶尔java习题 (0)
- Thinks with does (1)
最新评论
-
sassds:
佩服啊 高手
分享一款js特效 -
bhjackson:
学习啦,能否详细介绍下回溯的过程?O(∩_∩)O谢谢
分享回溯法- 找n个数中r个数的组合 -
zk7019311:
了解了解。。。。。
业务层代码复用的一点建议 -
lijie1819:
看到LZ的设计思想,感觉和抽象工厂模式有点相像。
业务层代码复用的一点建议 -
wjjcml1982:
酷毙了!楼主太强悍了!
分享一款js特效
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实现:
ok... 分享
恩 如果可以用动态规划算法实现 可以期待一下。。。
估计是做个小练习 要不就是面试题
(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
那么,这个可以用在什么地方呢?
发表评论
-
开散列的简单模拟(一)
2010-06-28 08:33 18221. 散列 散列有两种 ... -
递归和动态规划构造两个字符序列的最长公共字符子序列
2010-06-28 08:28 4494应je朋友要求,所以翻开以前的算法题目,整理了以下,给 ... -
最大公约数的应用 - 分享
2010-06-25 08:08 18541.先看一家大公司笔试题 数组中有n个数据,要将它们顺 ... -
信息数字化解逻辑题分享
2010-06-21 08:09 12561. 前提条件: 将逻辑题目中的信息用数字化描述。 ... -
递归算法分析-分享
2010-06-19 16:09 15921. 深入认识递归 (1) 递 ... -
非递归算法分析实例分享
2010-06-18 15:47 10561 仅仅依赖于问题规模的时间复杂度 (1) 例1: 交换i和 ... -
NP完全性问题
2010-06-18 14:02 7014在学习算法设计与分析时,经常会提到NP完全性问题,到底 ... -
算法分析精述分享
2010-06-18 12:03 8731. 算法分析的评价体系 评价算法的三条主要标准是: ... -
贪婪策略算法的总结分享
2010-06-11 08:30 60701. 贪婪算法描述 贪婪算法又叫登山法,它的根本思想是 ... -
带权有向图 - 边上权值非负情形的单源最短路径问题
2010-06-07 08:57 26791. 问题描述: 给定 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)四
2010-06-07 08:54 137021. 工作分配问题。 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)三
2010-06-07 08:53 109317. 字符统计问题。 编写一个算法,统计在一个输入 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)二
2010-06-07 08:47 13668. 数字迷问题。 A B C ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)一
2010-06-07 08:38 11801. 线程问题。 设计4个线程,其中两个线程每次对j增加 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)
2010-06-07 08:37 18811. 线程问题。 设计 ... -
Java快速排序算法整理(二)
2010-05-31 14:04 1033package boke.sort; /** * 快 ... -
Java快速排序算法整理(一)
2010-05-31 13:39 657package boke.sort; /** * 快 ... -
Java最小堆实现
2010-05-31 08:29 58521.堆结点 package boke.heap1; /* ... -
Java插入排序代码整理
2010-05-28 14:44 1252package boke.sort; /** * 插 ... -
Java选择排序代码整理
2010-05-28 14:37 1505package boke.sort; /** * 选 ...
相关推荐
这里是本蒟蒻整理/写的递归递推经典题目 上传供大家学习使用 包含:过河卒、过河卒升级版、汉诺塔、级数求和、勒让德多项式、流感传染、判断回文、判断元素是否存在、平方根级数、平面分割升级版、全排列递归版、...
本压缩包包含了一系列使用C++实现的递归经典题目,旨在帮助学习者深入理解和运用递归。 1. **自然数拆分.cpp**: 这个题目要求将一个自然数拆分成若干个正整数的和,所有可能的拆分情况都要被列出。递归在这里用于...
### JAVA编程:递归典型题目解析 在计算机科学中,递归是一种强大的编程技术,它允许函数调用自身来解决问题。本文将详细解析几个典型的JAVA编程递归题目,包括阶乘计算、摘桃子问题、斐波那契数列以及汉诺塔问题,...
好多递归经典题目 比如捕鱼问题 还有运动会金牌问题
本例中的“C#递归题目实例代码”旨在展示如何利用递归解决斐波那契数列的问题。斐波那契数列是一组数,其中每个数字是前两个数字的和,起始于0和1。数列的前几项为0, 1, 1, 2, 3, 5, 8, 13, 21, 34等。 递归函数`...
根据给定的信息,本文将详细解释C#中的递归概念,并通过具体的代码示例来解析递归函数在构建树形结构中的应用。 ### C#递归基础 #### 什么是递归? 递归是一种编程技术,它允许一个方法或函数直接或间接地调用自身...
根据给定的信息,本文将对杭电ACM题目中的搜索与递归求解知识点进行详细的解析,特别是针对题目编号为1010、1016、1026、1043(双广)、1044(BFS+DFS)等题目进行深入分析,并涵盖其他相关的知识点。 ### 搜索技术...
10. **注意事项**:递归可能导致栈溢出,尤其是在没有正确设置终止条件或者问题规模过大的情况下。在编写递归代码时,应确保理解递归调用的过程,并对递归深度有所控制。 通过学习“acm递归算法总结”,参赛者可以...
在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...
递归向下分析器,也称为自顶向下解析器,遵循自上而下的策略来解析输入的源代码,尝试将它分解成可理解的语法结构。 词法分析,又称扫描,是将源代码文本转换为一系列有意义的符号,即词法单元(token)。这些词法...
分享给大家供大家参考,具体如下: /*求二叉树叶子节点个数 -- 采用递归和非递归方法 经调试可运行源码及分析如下: ***/ #include #include #include using std::cout; using std::cin; using std::endl; using...
递归算法与非递归转化 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。递归的效率一般不高,但是递归比较符合人类的思维方式。一般而言非递归算法更有效;但很多...
在题目中提到的第一点,如果递归函数没有递归结束的语句,即没有定义基本情况,那么函数会不断地调用自身而无法停止,导致无穷递归,最终可能引发“栈溢出”错误,也就是我们常说的“死循环”。因此,编写递归函数时...
### 可并行递归算法的递归多线程实现:深入解析 #### 引言:多线程与并行处理的重要性 随着计算任务日益复杂,传统的单线程编程模型已无法满足高效处理大规模数据的需求。多线程编程作为一种提高程序并发性和性能...
- **效率问题**:由于递归涉及多次函数调用,相比于迭代,递归在某些情况下可能效率较低。 为了优化递归,可以采用以下策略: 1. **尾递归**:如果递归调用是函数的最后一个操作,并且返回值直接传递给调用者,那么...
### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business Application Programming)是一种用于SAP系统的编程语言。它不仅支持传统的过程化编程,还支持面向对象编程和Web开发。本文将深入探讨一个ABAP中...
阿克曼函数是一种非常特殊的数学函数,常用于理论计算和计算机科学中,特别是在讨论递归算法和计算复杂性时。这个函数是由荷兰数学家格奥尔格·阿克曼在20世纪早期提出的,它展示了超越函数的概念,即无法用初等函数...
这样做有助于我们理解递归函数是如何一层层向下进入递归,又如何一层层返回的。 掌握递归的关键 掌握递归对于计算机科学的学生来说至关重要。递归不仅仅是C++语言中的一个特性,它是一种解决问题的思维方式,广泛...
然而,在某些场景下,非递归算法可能更有利于性能优化或理解。本章将探讨如何将递归算法转换为非递归算法。 首先,我们要了解递归的定义。递归发生在一个过程或函数在定义中调用自身,这被称为直接递归。如果一个...