>  기사  >  백엔드 개발  >  PHP 순열 및 조합 알고리즘

PHP 순열 및 조합 알고리즘

WBOY
WBOY원래의
2016-07-29 09:10:501554검색

저는 예전부터 알고리즘에 관심이 많았어요. 작년 초에 iOS 교육을 할 때 선생님이 수업 시간에 누가 먼저 아이디어를 표현할 수 있는지 순위 질문을 주셨는데, 당장 코딩을 할 필요는 없었어요. 당시 북경과기대 신입생이 재빠르게 가능한 방법을 제시하고 선생님께서 승인해 주셨는데, 말은 간단하지만 생각보다 이해하기 쉽지는 않았습니다. 세부적인 것.

사실 저는 대학시절부터 로또번호를 C로 써보려고 했어요. 그 당시에는 한동안 복지복권3D와 스포츠복권 3번을 하면서 컴퓨터로 당첨가능번호를 가려보려고 했는데요. 그 당시 저는 그저 취미에 불과했고, 당시에는 경제적 여력이 없었고 한정된 생활비를 모두 잃은 뒤 제 시간에 이 돌아올 수 없는 길에서 벗어날 수 있었습니다.

제가 최근 진행한 모바일 게임 프로젝트에는 필수 순열과 조합 알고리즘이 있습니다. 지금은 클라이언트 작업을 하고 있지만 아직 PHP에 익숙해서 직접 작성 연습을 해보니 놀랍게도 PHP의 것이었습니다. 배열 기능은 사용하기 매우 편리합니다. 이제 몇 줄만 사용하면 됩니다. 단점에 대해 조언해 주시면 감사하겠습니다.

<?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;
}


// ====== 测试 ======
$a = array("A", "B", "C", "D");

$r = arrangement($a, 2);
var_dump($r);

$r = A(4, 2);
echo $r."\n";

$r = combination($a, 2);
var_dump($r);

$r = C(4, 2);
echo $r."\n";


또한 몇 년 전 PHP를 교육할 때 루프 매트릭스 알고리즘도 작성했습니다. 관심 있는 학생들은 여기에서 허용되지 않습니다. "월초에 Sina의 알고리즘에 대한 서면 테스트 문제", 두 번째 항목은 모두가 배우고 소통할 수 있는 저의 원본 버전입니다.

위에서는 PHP 순열 및 조합 알고리즘을 소개했으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.