`

实践递归

阅读更多

描述: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编程技巧,同时享受到编程...

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

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

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

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

    Chap17 递归1

    在计算机科学的领域中,递归是一种重要的编程思想,它允许函数自我调用来...通过学习和实践递归,程序员能够培养出更深层次的问题解决能力,在复杂的编程世界中更自如地应用这种技巧,从而在软件开发中取得更高的成就。

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

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

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

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

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

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

    day20_DiGui_sailuix_递归_

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

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

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

    ACM算法设计之递归与分治

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

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

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

    递归算法

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

    递归下降分析程序.pdf

    递归下降分析法是一种用于编写编译器和解释器中语法分析器的技术。它通过递归地调用函数来分析输入的符号串,并且每个函数...实践递归下降分析程序不仅加强了我们对编译原理的理解,也锻炼了我们编写高效算法的能力。

    递归出来的美丽分形世界

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

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics