`

实践递归

阅读更多

描述:1,2,3......n 从n中取出r个数。
例如:n=5,r=3
1-2-3,1-2-4,1-2-5,1-3-4,1-3-5,1-4-5
2-3-4,2-3-5,2-4-5
3-4-5

下面是我的解决方法,还有其他的方法么?

java 代码
  1. import java.util.ArrayList;   
  2. import java.util.Collections;   
  3. import java.util.HashSet;   
  4. import java.util.Iterator;   
  5. import java.util.List;   
  6. import java.util.Set;   
  7. import java.util.Stack;   
  8.   
  9. public class Combination {   
  10.     private List result;   
  11.     private int r = 4;   
  12.     private int n = 7;   
  13.   
  14.     public Combination() {   
  15.         result = new ArrayList();   
  16.         Stack permutation = new Stack();   
  17.         for (int i = 1; i < r + 1; i++) {   
  18.             permutation.push(i);   
  19.         }   
  20.         result.add(permutation);   
  21.     }   
  22.   
  23.     public static void main(String[] args) {   
  24.         Combination com = new Combination();   
  25.         com.compose(com.result.size());   
  26.         com.removeExisted();   
  27.         com.sortList();   
  28.         com.print();   
  29.     }   
  30.   
  31.     private void sortList() {   
  32.         List sorted = new ArrayList();   
  33.         for (Iterator iter = result.iterator(); iter.hasNext();) {   
  34.             Stack element = (Stack) iter.next();   
  35.             StringBuffer sb = new StringBuffer();   
  36.             for (Iterator iterator = element.iterator(); iterator.hasNext();) {   
  37.                 int i = (Integer) iterator.next();   
  38.                 sb.append(i + "-");   
  39.             }   
  40.             sb.deleteCharAt(sb.length()-1);   
  41.             sorted.add(sb.toString());   
  42.         }   
  43.         Collections.sort(sorted);   
  44.         result=sorted;   
  45.     }   
  46.   
  47.     private void removeExisted() {   
  48.         Set set = new HashSet();   
  49.         for (Iterator iter = result.iterator(); iter.hasNext();) {   
  50.             set.add(iter.next());   
  51.         }   
  52.         result.clear();   
  53.         result.addAll(set);   
  54.     }   
  55.   
  56.     private void print() {   
  57.         System.out.println("result:");   
  58.         for (Iterator iter = result.iterator(); iter.hasNext();) {   
  59.             String element = (String) iter.next();   
  60.             System.out.println(element);   
  61.         }   
  62.     }   
  63.   
  64.     private void compose(int size) {   
  65.         for (int i = 0; i < size; i++) {   
  66.             Stack element = (Stack) result.get(i);   
  67.             int max = (Integer) element.peek();   
  68.             if (max == n) {   
  69.                 return;   
  70.             } else {   
  71.                 Stack copyedS = copyStack(element);   
  72.                 ++max;   
  73.                 createNewComS(copyedS, max);   
  74.             }   
  75.         }   
  76.         compose(result.size());   
  77.     }   
  78.   
  79.     private void createNewComS(Stack original, int max) {   
  80.         for (int i = 0; i < r; i++) {   
  81.             Stack copyedS = copyStack(original);   
  82.             copyedS.remove(i);   
  83.             copyedS.push(max);   
  84.             result.add(copyedS);   
  85.         }   
  86.     }   
  87.   
  88.     private Stack copyStack(Stack element) {   
  89.         Stack copyed = new Stack();   
  90.         for (int i = 0; i < element.size(); i++) {   
  91.             int num = (Integer) element.get(i);   
  92.             copyed.push(num);   
  93.         }   
  94.         return copyed;   
  95.     }   
  96. }   
分享到:
评论

相关推荐

    C++递归思想课件下载

    **C++递归思想详解** 递归是一种强大的编程技术,尤其在C++中,它能够以简洁优雅的方式解决复杂的问题。递归的核心在于函数或算法自身调用自身,通过不断缩小...通过理解和实践递归,可以解决许多看似复杂的计算问题。

    koch曲线的递归算法

    总之,Koch曲线是一个引人入胜的数学对象,它体现了分形几何的魅力,同时也是一个理解和实践递归算法的实用案例。无论是在理论研究还是实际应用,如图像处理、游戏设计或艺术创作,Koch曲线都有其独特的价值。通过...

    c语言递归解24点游戏

    《C语言实现递归解24点游戏》 24点游戏是一款广受欢迎...尽管存在小缺陷,但这个小程序为我们提供了一个很好的学习和实践递归算法的平台。在完善和优化的过程中,我们不仅能提升编程技能,还能进一步掌握C语言的精髓。

    递归算法(c#图形演绎)

    总的来说,这个项目结合了编程基础、算法设计、图形用户界面和交互逻辑,是一个很好的学习和实践递归及C# WinForm编程的实例。通过这个项目,开发者不仅可以提升对递归的理解,还能提高GUI编程技巧,同时享受到编程...

    实验二 递归下降语法分析程序设计

    实验指导书中会包含具体的步骤、示例代码以及操作流程,以帮助学生理解和实践递归下降分析。 首先,理解递归下降分析的关键在于构造解析函数。每个解析函数对应文法的一个产生式,如果产生式的右部只有一个非终结符...

    递归下降语法分析实验报告

    总之,这个实验提供了一个实践递归下降语法分析的机会,使学生能够在实际编程中巩固编译原理课程中的理论知识,同时也培养了他们解决语法分析问题的能力。通过这样的实验,学生能够更好地理解和应用编译器设计的基本...

    4.5递归算法与递归程序[汇编].pdf

    先通过汉诺塔游戏引入递归概念,然后通过解决斐波那契兔子问题来实践递归编程。 8. **预备知识**:学生需要掌握基本的程序设计知识,如解析法、穷举法、查找法和排序法,以及用计算机解决问题的基本流程。 9. **...

    digui_编译原理_递归下降算法_递归下降_digui_

    由于没有更详细的信息,我们只能推测"digui"可能是一个自定义的解析器或工具,用于帮助理解和实践递归下降算法。它可能包含了具体的解析函数,每个函数对应文法的一个规则,并通过递归调用来解析源代码。 **实现...

    C#控制台用递归方法显示树形结构

    在编程领域,尤其是在数据结构和算法的学习中,树形结构是一种非常重要的概念。它用于模拟具有层次关系的数据,比如文件系统、...但是,这个基本框架提供了一个良好的起点,让你能够理解和实践递归以及树形结构的概念。

    day20_DiGui_sailuix_递归_

    8. **学习资源**:“day20_DiGui”可能包含了关于递归的实例代码、练习题和讲解材料,通过这些资源,你可以更深入地理解和实践递归。 通过学习和实践,掌握递归不仅可以提高编程能力,还能让你在面对复杂问题时有更...

    递归数据结构及算法设计教学探讨.pdf

    除了理论分析,文章还提供了实现递归算法的程序代码和主函数示例,这对于学生理解并实践递归算法设计尤为重要。代码示例不仅包括单链表的节点定义和递归函数的编写,还涉及如何在主函数中调用这些递归函数来完成特定...

    ACM算法设计之递归与分治

    在算法设计领域,递归与分治是两种非常重要的策略,尤其在解决复杂问题时,它们能提供简洁而高效的解决方案。...通过学习和实践递归与分治,我们可以提高编程能力和问题解决能力,更好地应对各种计算挑战。

    DiGui.zip_Java 8_YBA_排列_汉诺塔_递归

    总的来说,这个压缩包提供了实践递归算法的良好机会,有助于深入理解递归的思想和Java编程基础。通过学习和实践这两个问题,开发者不仅可以掌握递归的运用,还能进一步提升对Java 8特性的认识。对于初学者来说,这是...

    递归算法

    在编程领域,递归算法是一种强大的工具,它通过函数或过程调用自身的方式来解决问题。递归的核心在于将复杂的问题分解为简单的...通过`Combination.java`和`Test.java`这样的示例,我们可以更好地理解和实践递归算法。

    递归出来的美丽分形世界

    对于初学者,这样的资源是理解和实践递归分形的宝贵资料。 “毕达哥拉斯树”是压缩包中的文件名,这很可能是指一种特定的分形图案。毕达哥拉斯树源于古希腊数学家毕达哥拉斯的名字,它是由一系列等腰三角形构成的,...

    编译原理,下降递归分析算法

    ### 编译原理中的递归下降分析算法 #### 基本概念与目的 递归下降分析算法是编译原理...通过实践递归下降分析,学习者可以有效提升自己的编程技巧和工程设计能力,为进一步的学术研究或职业发展奠定坚实的技术基础。

    VC 九宫图算法(递归算法).rar

    在编程领域,递归算法是一种基于...总之,这个压缩包提供的实例展示了如何运用递归算法来生成九宫图,帮助开发者理解和实践递归编程技巧,尤其在解决约束条件下的搜索问题时,递归算法往往能提供简洁且高效的解决方案。

    javascript-leetcode面试题解递归与回溯问题之第1291题顺次数-题解.zip

    在JavaScript编程领域,LeetCode是一个非常重要的在线平台,它提供了大量的编程题目,帮助开发者提升算法能力和解决问题的...同时,对于想要提升编程能力的开发者,理解和实践递归与回溯也是提升技术实力的关键步骤。

    毕业设计MATLAB_用于Simulink的递归模糊神经网络.zip

    总的来说,这个毕业设计项目为学生提供了一个实践递归模糊神经网络和Simulink相结合的平台,不仅锻炼了编程能力,也加深了对智能控制理论的理解。通过深入研究和操作,学生将能够掌握这一领域的核心技术和方法,为...

    数据结构二叉树遍历递归,非递归

    通过《BiTree》这个文件,我们可以实践以上理论,编写递归和非递归的遍历算法,并通过实际示例加深理解。这有助于提升对数据结构的理解,增强算法设计和实现能力。在学习过程中,可以尝试不同的数据结构和优化策略,...

Global site tag (gtag.js) - Google Analytics