`
xiang37
  • 浏览: 431735 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

递归实现数学排列

 
阅读更多

递归,还是回溯?选择了递归,记得回溯算法,以前课程设计做的一个迷宫程序涉及到。

 

 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.xiva.baseKnowledge;

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;

/**
 * @Description "4"不能在第三位,"3"与"5"不能相连
 * @author XIVA
 */
public class Arrangement {
        
    //static int numArray[] = {1, 2, 2, 3, 4, 5};
    static int numArray[] = {1, 2, 2, 3, 4, 5};
    //static int[] result = {0,0,0,0,0,0};
    static int[] result = new int[numArray.length];
    static int index = 0;
    static int count = 0;
    static boolean isOut = false;
    static Set arraySet = new LinkedHashSet();//存储
    
    
    public static int getArrangement(int array[]){
        boolean checkOut = true;
        if(array.length < 1){
            //System.out.print("Start:");
            for(int j = 0; j < result.length; j++){
                 //System.out.print(result[j]);
                //业务判断过滤
                if(result[j] == 4 && j == 3){
                    checkOut = false;
                }
                
                if( result[j] == 3){
                    if((j>0 && result[j-1] == 5) || (j < result.length - 1 && result[j + 1] == 5)){
                        checkOut = false;
                    }
                }
            }
            //System.out.println("");
            isOut = true;
            String reStr = Arrays.toString(result);
            
            //arraySet.contains(reStr)可以不需要判断
            if(arraySet.contains(reStr) || !checkOut){
                System.out.println(reStr);
            }else{
                arraySet.add(reStr);
            }
            count = count + 1;
            return 1;
        }
        for(int i = 0; i < array.length; i ++){
            //此处还可以简化
            int[] headArray = Arrays.copyOfRange(array, 0, i);
            int[] footArray  = Arrays.copyOfRange(array, i + 1, array.length);
            int[] newArray = new int[headArray.length + footArray.length];
            
            //数组复制
            System.arraycopy(headArray, 0, newArray, 0, headArray.length);
            System.arraycopy(footArray, 0, newArray, headArray.length, footArray.length);
            if( isOut){
                index = numArray.length - array.length;
                isOut = false;
            }
            result[index] = array[i];
            index = index + 1;
            //if( newArray.length > 0)
            //递归调用   
            getArrangement(newArray);
        }
        return 0;
    }
    
    public static void main(String[] args){
        
        getArrangement(numArray);
        System.out.println(count);
        System.out.println(arraySet.size());
        
    }
    
}

 

 最终,set中存放的是类似于“[5, 4, 3, 2, 2, 1]” 的字符串。这样即使使用10以上的数进行排列,也保证了数据的正确性。

 

本题目中未加入过滤是的结果个数应该是:6!/2!

 

当然这个排列算法只考虑了排列的一种情况那就是全排列。

分享到:
评论

相关推荐

    易语言源码递归法取排列组合易语言源码例程.7z

    递归法是一种函数或过程调用自身的技术,通过不断自我调用来解决问题,尤其适用于数据结构如树、图以及数学上的排列组合计算。 排列组合是组合学中的基本概念,排列是指从n个不同元素中取出m(m≤n)个元素,按照...

    排列组合一个练习以及递归输出排列的PPT

    排列组合算法的递归实现 排列组合是数学中的一种基本概念,指的是从一个集合中选择若干个元素,考虑其顺序的排列方式。排列组合的计算在计算机科学和数学中有非常广泛的应用,例如数据分析、机器学习、密码学等领域...

    组合排列组合排列组合排列组合排列

    通过查看这个文件,我们可以了解具体的实现细节,包括使用的数据结构、递归或非递归的策略,以及如何处理边界条件等。 总的来说,组合排列是解决许多实际问题的基础,包括优化、概率计算和统计分析等。理解和掌握这...

    C#实现排列组合算法完整实例

    其实排列实现了,组合也就实现了,组合C(N,R)就是P(N,R)/P(R,R) ,实现这一功能比较简单的是递归算法,但考虑到递归的性能,下面采用了2种非递归的方法,具体代码如下 using System; using System.Collections....

    c语言实现的排列组合程序

    本文将详细探讨如何使用C语言来实现排列组合算法,并结合递归解决P(m,n)问题。 首先,我们要理解排列和组合的基本概念。排列是指从n个不同元素中取出m个元素,按照一定的顺序进行排列,其数量由阶乘表示,即P(m,n) ...

    使用java递归实现汉诺塔(Hanio)

    汉诺塔(Hanoi)问题是一个经典的递归算法问题,起源于19世纪法国数学家爱德华·卢卡斯提出的一个智力游戏。这个游戏中有三个柱子和一堆大小不一的圆盘,所有圆盘起初都堆在第一个柱子上,按照由大到小的顺序...

    算法分析 递归算法 n个数据的排列数

    在数学上,排列是指从n个不同元素中取出m(m≤n)个元素的所有可能的顺序。如果m=n,即取出所有元素进行排列,那么这个操作称为全排列。对于给定的数据集合,其总排列个数可以通过阶乘来表示,即n!(n的阶乘),即n ...

    hanoi塔非递归.rar

    汉诺塔(Hanoi Tower)是一个经典的计算机科学问题,它源于19世纪由法国数学家爱德华·卢卡斯提出的。这个问题的目标是将一个柱子上的所有盘子,通过两个辅助柱子,按照特定规则移动到另一个柱子上。汉诺塔游戏通常...

    递归九讲2021 7-9.zip

    排列组合是组合数学中的重要概念,递归可以用来计算组合数(C(n,k)),或者生成所有可能的组合。非递归实现通常涉及动态规划或循环结构,如Fibonacci序列的矩阵快速幂算法。 1. **组合问题**:不考虑元素顺序,只需...

    组合数学fibonacci数列递归非递归求解

    Fibonacci数列是数学中一个非常著名的数列,它由以下递归定义: - F(1) = 1 - F(2) = 1 - 对于所有 n &gt; 2,有 F(n) = F(n-1) + F(n-2) 这个数列起源于意大利数学家斐波那契(Leonardo Fibonacci)提出的一个兔子...

    易语言源码排列组合模块(M选N)源码.rar

    本压缩包“易语言源码排列组合模块(M选N)源码.rar”提供了实现M选N排列组合功能的源代码,适用于学习易语言编程、算法设计以及组合数学的应用。排列组合是组合学中的基本概念,对于理解和解决许多实际问题,如概率...

    全排列算法的非递归实现与递归实现的方法(C++)

    (一)非递归全排列算法基本思想是: 1.找到所有排列中最小的一个排列P. 2.找到刚刚好比P大比其它都小的排列Q, 3.循环执行第二步,直到找到一个最大的排列,算法结束.下面用数学的方法描述:给定已知序列 P = A1A2A3...

    不得不说的全排列算法递归实现

    为了实现全排列算法的递归,我们需要定义一个递归函数,该函数具有至少两个参数:当前的排列状态和未排列元素的列表。每次递归调用时,都将当前选择的元素加入到排列状态中,并从未排列列表中移除该元素。当未排列...

    PHP实现多种类型的排列组合算法

    首先,排列和组合是离散数学中的基本概念。排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排列起来,形成不同的排列方式。组合则是指从n个不同元素中不考虑顺序取出m个元素的方法数量。在PHP中,我们...

    IT面试笔试--排列和组合的代码实现,运行正确+详细注释

    全排列的常见实现方式有两种:递归排列和字典序排列。 1. **递归排列**: - **递归实现方法一**:该方法通过交换元素来生成排列。首先选择一个元素作为排列的第一个元素,然后对剩下的元素进行递归全排列。当长度...

    递归数据结构的数学定义.pdf

    广义表的定义通常涉及到递归的函数,以描述表内的元素如何按照一定的顺序排列。 总结来说,递归数据结构的数学定义往往需要采用递归的方式,将结构中的每个部分与整体联系起来,以便能够准确地反映其层级和递归性质...

    C++实现圆排列算法程序与演示

    圆排列是一个经典的组合数学问题,它涉及到在圆形表上摆放n个不同的对象,使得每两个相邻的对象都不相同。我们还将讨论EasyX库的使用,这是一个方便的图形用户界面库,用于在C++中进行图形绘制。 首先,让我们了解...

    汉诺塔非递归程序

    汉诺塔问题是一种经典的递归算法示例,但同样也可以通过非递归的方式进行实现。在给定的C++代码中,我们看到了一种不依赖于递归调用来解决汉诺塔问题的方法。以下是对该非递归程序的详细解析: ### 汉诺塔问题背景 ...

Global site tag (gtag.js) - Google Analytics