四种语言完美实现组合算法
php
<?php function rxn($start, $bit, $n, $m) { static $name = __FUNCTION__; static $result = array(); static $arr = array(); for ($i=$start; $i<$n-$m+$bit; $i++) { $arr[$bit-1] = $i; if ($bit == $m) { array_push($result, $arr); } else if ($bit < $m) { $name($i+1, $bit+1, $n, $m); } } return $result; } $result = rxn(0,1, 3,2); var_dump($result);
js
var result = []; var rxn = function(start, bit, arr, n, m) { var name = arguments.callee; for (var i=start; i<n+m-bit; i++) { arr[bit-1] = i; if (bit == m) { result.push(Array.prototype.slice.call(arr)); } else if (bit < m) { name.call(null,i+1, bit+1, arr, n, m); } } } var n = 3, m = 2; ret = rxn(0,1,[],n,m); console.log(result);
python
#! /usr/bin/python3 import copy def rxn(start, bit, arr, n, m, result=[]): for i in range(start, n+m-bit): arr[bit-1] = i if bit == m: result.append(copy.copy(arr)) elif bit < m: rxn(i+1, bit+1, arr, n, m) return result n, m = 3, 2 result = rxn(0,1,[None for i in range(m)], n, m) print(result)
go
package main import "fmt" var result [][]int func rxn(start, bit, n, m int, arr map[int]int) { for i:=start; i<n+m-bit; i++ { arr[bit-1] = i if bit == m{ var t []int for _, v := range arr { t = append(t, v) } result = append(result, t); } else if bit < m { rxn(i+1, bit+1, n, m, arr) } } } func main() { n,m := 3,2 arr := make(map[int]int) rxn(0, 1, n, m, arr) fmt.Println(result) }