当前位置: 首页 > news >正文

PHP排列组合算法

排列:从M个数字中选择N个数字,数字可以重复
组合:从M个数字中选择N个数字,数字不能重复

<?php
 // 阶乘
function factorial($n)
 {
	return array_product(range(1, $n));
}
 
// 计算排列个数
function A($n, $m) 
{
	return factorial($n)/factorial($n-$m);
}
 
// 计算组合个数
function C($n, $m) 
{
	return A($n, $m)/factorial($m);
}
 
// 排列
function arrangement($a, $m)
 {
	$r = array();
 	$n = count($a);
	if ($m <= 0 || $m > $n)
	 {
		return $r;
	}
 	for ($i=0; $i<$n; $i++)
 	 {
		$b = $a;
		$t = array_splice($b, $i, 1);
		if ($m == 1)
		 {
			$r[] = $t;
		}
		 else
		  {
			$c = arrangement($b, $m-1);
			foreach ($c as $v) {
				$r[] = array_merge($t, $v);
			}
		}
	}
	return $r;
}
 
// 组合
function combination($a, $m)
 {
	$r = array();
 	$n = count($a);
	if ($m <= 0 || $m > $n)
	 {
		return $r;
	}
 	for ($i=0; $i<$n; $i++) 
 	{
		$t = array($a[$i]);
		if ($m == 1)
		 {
			$r[] = $t;
		}
		 else
		  {
			$b = array_slice($a, $i+1);
			$c = combination($b, $m-1);
			foreach ($c as $v) {
				$r[] = array_merge($t, $v);
			}
		}
	}
 	return $r;
}

// ====== 测试 ======
$arr = array(1,2,3,4,5);//可用数字
$arr_len=count($arr);
$maxlength=3;	//选择几位

$r = A($arr_len, $maxlength);
echo "排列 P({$arr_len}, {$maxlength})={$r}<br>";

$r = arrangement($arr, $maxlength);
foreach($r as $v)
{
	echo join('',$v).' ';
}
echo '<hr>';
$r = C($arr_len, $maxlength);
echo "组合 C({$arr_len}, {$maxlength})={$r}<br>";

$r = combination($arr, $maxlength);
foreach($r as $v)
{
	echo join('',$v).' ';
}
排列 P(5, 3)=60
123 124 125 132 134 135 142 143 145 152 153 154 213 214 215 231 234 235 241 243 245 251 253 254 312 314 315 321 324 325 341 342 345 351 352 354 412 413 415 421 423 425 431 432 435 451 452 453 512 513 514 521 523 524 531 532 534 541 542 543
组合 C(5, 3)=10
123 124 125 134 135 145 234 235 245 345

原文转自:https://blog.csdn.net/song5198038_1/article/details/50188739
略作修改

相关文章:

  • 通信运营商如何理性应对带号转网(1)
  • 使用MySQL触发器自动生成日汇总表
  • C#使用DES加解密数据
  • Install nodejs on CentOS 7+
  • WindowsMobile上C#通过DirectShow控制摄像头
  • MACBOOK 调教指北
  • 关于Apache无法加载PHP 7.2 curl模块问题的解决办法
  • 墙脆脆?!
  • 在群晖DS218+上编译Fluffos的Docker镜像
  • 将自己的SSH密钥对导入YubiKey 5的PIV和智能卡模块,配合Putty和XShell使用
  • 快照(Snapshot)技术发展综述
  • 国产开源硬件力作CanoKey,替代昂贵的Yubikey!
  • 在CentOS上升级OpenSSL 1.1.1k
  • firewall-cmd 常用命令
  • 俞敏洪在北京大学2008年开学典礼上的发言
  • dva中组件的懒加载
  • java8-模拟hadoop
  • JavaScript新鲜事·第5期
  • Laravel 中的一个后期静态绑定
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • node入门
  • react 代码优化(一) ——事件处理
  • ReactNativeweexDeviceOne对比
  • Vue 动态创建 component
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 问题之ssh中Host key verification failed的解决
  • 硬币翻转问题,区间操作
  • 用简单代码看卷积组块发展
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 智能网联汽车信息安全
  • 第二十章:异步和文件I/O.(二十三)
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • #13 yum、编译安装与sed命令的使用
  • $forceUpdate()函数
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (5)STL算法之复制
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (二)fiber的基本认识
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (转)LINQ之路
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @SuppressWarnings注解
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2024-06]-[大模型]-[Ollama]- WebUI
  • [Android]使用Retrofit进行网络请求
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [BT]小迪安全2023学习笔记(第29天:Web攻防-SQL注入)
  • [bzoj1324]Exca王者之剑_最小割
  • [C++][基础]1_变量、常量和基本类型
  • [Everyday Mathematics]20150130