Scala写的排列组合

package learn

import java.util

class pailiezuhe {

//获取组合数

  def getzuhe_num(n:Int,m:Int):Int={

    getpailie_num(n,m,0)/getpailie_num(m,m,0)

  }
  def swap(data:Array[String],i:Int,j:Int): Unit =
  {
    var temp = data(i)
    data(i)=data(j)
    data(j)=temp
  }

//输出所有组合可能
  def print_zuhe(data:Array[String],selected:Array[String],n:Int,index:Int): Unit ={

    if(index>=n)
      {
        selected.foreach(item=>print(item) )
        println()
      }
    else
      {

        for(i <- index to data.length-(n-index)){
            selected(index)=data(i)
            //
            print_zuhe(data,selected,n,i+1)

          }


      }

  }

 
  //全排列输出
  def print_pailie(data:Array[String],index:Int): Unit ={

    if(index>=data.length-1)
      {
        data.map(item => print(item))
        println("----")
      }
    else {

      for(i <- index  until  data.length){
          swap(data,index,i)
          print_pailie(data,index+1)
          swap(data,index,i)

        }

    }
  }

  //获取排列数
  def getpailie_num(n:Int,m:Int,index:Int):Int={
    /*
    n=4 m =2
    num = 4*3 = 12

    n=4 m =4
    num = 4*3*2*1

    n=4 m=3
    num = 4*3*2
    n*(n-1)*(n-2),
     */
    if(index==m)
      1
    else
    //index < m
    (n-index)*getpailie_num(n,m,index+1)


  }


}


object pailiezuhe{

  var pailiezuhe = new pailiezuhe

  def main(args:Array[String]): Unit =
  {

    println(pailiezuhe.getpailie_num(4,2,0))

    println(pailiezuhe.getzuhe_num(3,2))
/*
formatfa bin mxk
bin formatfa mxk
max forma bin
 */
    var arrayTest = Array("FormatFa","Bin","mxk")
    print("arrarLen:"+arrayTest.length)
    pailiezuhe.print_pailie(arrayTest,0)
    pailiezuhe.swap(arrayTest,0,2)
    print(arrayTest.map(item=>println(item)))


    var arrayTest2 = Array("1","2","3")
    var selected = new Array[String](arrayTest2.length)
    pailiezuhe.print_zuhe(arrayTest2,selected,3,0 )

    /*
    1,2,3,4
     */

  }


}

输出个别排序可以先获取组合,在输出每个的全排列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值