[php]全排列非递归置换法

N!排列,最容易理解的就是置换法了,代码如下,非递归


<?php

function appendItem( $c , &$arr )
{
	if(!$arr) $arr[] = $c;
	else 
	{
		$p      = $arr;
		$arr  = array();
		foreach( $p as $k=>$v)
		{
 			$arr = array_merge($arr , walkString($c,$v) );
		}
	}
}

function walkString( $char , $string )
{
    $mt[] = $ns = $string.$char;
	$sl = strlen( $string );
	while( $sl )
	{
		$tmp  		= $ns{$sl};
		$ns{$sl}	= $ns{$sl-1};
		$ns{$sl-1}	= $tmp;
		$mt[] = $ns;
		$sl--;
	}
	
	return $mt;
	
}
function combine( $array )
{
	$len = count( $array );
	$arr = array();
	for( $i=0 ; $i < $len ; $i++ )
	{
		appendItem( $array[$i] , $arr );
	}
	return $arr;
}
set_time_limit( 0 );
$arr = str_split('abcd');
print_r( combine($arr));
?>

posted @ 2011-01-17 21:42  一缕青烟  阅读(309)  评论(0编辑  收藏  举报