Hướng dẫn nchoosek python

Here is a more complete answer. You should use itertools.combinations and not the itertools.permutations as combination is very different from permutation.

For instance if you needed all the two element combinations of an array such as [1,2,3,5] the following code will produce the result that you want (equivalent of nchoosek in Matlab)

>>> import itertools
>>> all_combos = list(itertools.combinations([1,2,3,5], 2))
>>> print all_combos
[(1, 2), (1, 3), (1, 5), (2, 3), (2, 5), (3, 5)]

if You would like all the combinations as a 2d array just convert the tuple list to a numpy array using the following command:

>>> all_combos = np.array(list(itertools.combinations([1,2,3,5], 2)))
>>> print all_combos
[[1 2]
[1 3]
[1 5]
[2 3]
[2 5]
[3 5]]

This language bar is your friend. Select your favorite languages!

    Select your favorite languages :

    • Or search :

    • Clojure
    • C#
    • D
    • Dart
    • Fortran
    • Go
    • Haskell
    • JS
    • Java
    • PHP
    • Pascal
    • Perl
    • Perl
    • Ruby
    • Rust

    (defn binom [n k]
      (let [fact #(apply * (range 1 (inc %)))]
        (/ (fact n)
           (* (fact k) (fact (- n k))))))

    public BigInteger binom(int n, int k)
    {
    	return factorial(n)/(factorial(k) * factorial(n-k));
    }
    
    public BigInteger factorial(int x)
    {
    	BigInteger result = 1;
    	for(int i=1;i<=x;i++)
    	{
    	result = result * i;
    	}
    	return result;
    }
    

    BigInt binom(uint n, uint k)
    {
       assert(n >= k);
       BigInt r = 1;
       for(uint i = 0; i <= k; ++i)
       {
          r *= n-i;
          r /= i+1;
       }
       return r;
    }

    int binom(int n, int k) {
      int result = 1;
      for (int i = 0; i < k; i++) {
        result = result * (n - i) ~/ (i + 1);
      }
      return result;
    }

    integer, parameter :: i8 = selected_int_kind(18)
    integer, parameter :: dp = selected_real_kind(15)
    n = 100
    k = 5
    print *,nint(exp(log_gamma(n+1.0_dp)-log_gamma(n-k+1.0_dp)-log_gamma(k+1.0_dp)),kind=i8)

    z := new(big.Int)
    z.Binomial(n, k)

    • Demo
    • Doc

    binom n k = product [1+n-k..n] `div` product [1..k]
    

    const fac = x => x ? x * fac (x - 1) : x + 1
    const binom = (n, k) => fac (n) / fac (k) / fac (n - k >= 0 ? n - k : NaN)

    import java.math.BigInteger;

    static BigInteger binom(int N, int K) {
        BigInteger ret = BigInteger.ONE;
        for (int k = 0; k < K; k++) {
            ret = ret.multiply(BigInteger.valueOf(N-k))
                     .divide(BigInteger.valueOf(k+1));
        }
        return ret;
    }

    • Demo
    • Origin

    • Demo
    • Doc

    var
      N, K, Res: TValue;
    begin
      Res := BinomN(N, K);
    end.

    sub binom {
      my ($n, $k) = @_;
      if ($k > $n - $k) { $k = $n - $k }
      my $r = 1;
      for ( my $i = $n/$n ; $i <= $k;) {
        $r *= $n-- / $i++
      }
      return $r
    }

    sub binom {
       my ($n, $k) = @_;
       my $fact = sub {
          my $n = shift;
          return $n<2 ? 1 : $n * $fact->($n-1);
       };
       return $fact->($n) / ($fact->($k) * ($fact->($n-$k)));
    }

    def binom(n,k)
      (1+n-k..n).inject(:*)/(1..k).inject(:*)
    end

    extern crate num;
    
    use num::bigint::BigInt;
    use num::bigint::ToBigInt;
    use num::traits::One;

    fn binom(n: u64, k: u64) -> BigInt {
        let mut res = BigInt::one();
        for i in 0..k {
            res = (res * (n - i).to_bigint().unwrap()) /
                  (i + 1).to_bigint().unwrap();
        }
        res
    }

    • Demo

    • Python
    def binom(n, k):
        return math.factorial(n) // math.factorial(k) // math.factorial(n - k)

    • Python
    def binom(n, k):
        return math.comb(n, k)

    • Clojure
    (defn binom [n k]
      (let [fact #(apply * (range 1 (inc %)))]
        (/ (fact n)
           (* (fact k) (fact (- n k))))))

    • C#
    public BigInteger binom(int n, int k)
    {
    	return factorial(n)/(factorial(k) * factorial(n-k));
    }
    
    public BigInteger factorial(int x)
    {
    	BigInteger result = 1;
    	for(int i=1;i<=x;i++)
    	{
    	result = result * i;
    	}
    	return result;
    }
    

    • D
    BigInt binom(uint n, uint k)
    {
       assert(n >= k);
       BigInt r = 1;
       for(uint i = 0; i <= k; ++i)
       {
          r *= n-i;
          r /= i+1;
       }
       return r;
    }

    • Dart
    int binom(int n, int k) {
      int result = 1;
      for (int i = 0; i < k; i++) {
        result = result * (n - i) ~/ (i + 1);
      }
      return result;
    }

    • Fortran
    integer, parameter :: i8 = selected_int_kind(18)
    integer, parameter :: dp = selected_real_kind(15)
    n = 100
    k = 5
    print *,nint(exp(log_gamma(n+1.0_dp)-log_gamma(n-k+1.0_dp)-log_gamma(k+1.0_dp)),kind=i8)

    • Go
    z := new(big.Int)
    z.Binomial(n, k)

    • Haskell
    binom n k = product [1+n-k..n] `div` product [1..k]
    

    • JS
    const fac = x => x ? x * fac (x - 1) : x + 1
    const binom = (n, k) => fac (n) / fac (k) / fac (n - k >= 0 ? n - k : NaN)

    • Java
    static BigInteger binom(int N, int K) {
        BigInteger ret = BigInteger.ONE;
        for (int k = 0; k < K; k++) {
            ret = ret.multiply(BigInteger.valueOf(N-k))
                     .divide(BigInteger.valueOf(k+1));
        }
        return ret;
    }

    • PHP
    gmp_binomial($n, $k);

    • Pascal
    var
      N, K, Res: TValue;
    begin
      Res := BinomN(N, K);
    end.

    • Perl
    sub binom {
      my ($n, $k) = @_;
      if ($k > $n - $k) { $k = $n - $k }
      my $r = 1;
      for ( my $i = $n/$n ; $i <= $k;) {
        $r *= $n-- / $i++
      }
      return $r
    }

    • Perl
    sub binom {
       my ($n, $k) = @_;
       my $fact = sub {
          my $n = shift;
          return $n<2 ? 1 : $n * $fact->($n-1);
       };
       return $fact->($n) / ($fact->($k) * ($fact->($n-$k)));
    }

    • Ruby
    def binom(n,k)
      (1+n-k..n).inject(:*)/(1..k).inject(:*)
    end

    • Rust
    fn binom(n: u64, k: u64) -> BigInt {
        let mut res = BigInt::one();
        for i in 0..k {
            res = (res * (n - i).to_bigint().unwrap()) /
                  (i + 1).to_bigint().unwrap();
        }
        res
    }