Jump to content
php.lv forumi

Rekursijas algoritms


stepan

Recommended Posts

Palidziet ludzu tikt gala ar rekursijas algoritmu. Ideja ir sekojosha: ir datubaze un tabula, kura ir viens laukums next_id - ieksha var but vai nu integer skaitlis (id) vai nu intervals formata sakuma_skaitlis - beigu skaitlis (id). Tatad veidojas koks ar zaroshanu. Tai zaroshanai ir jabut definetai IF THEN nosacijumos.

Mana pieeja:

izveidoju globalo masivu data un katru vilni rakstu jauna masiva elementa'. Vilnis = masivs. Ja notiek sashkelshanas nemu pirmo elementu un turpinu aktivo vilni, bet parejiem kopeju aktiva vilna asti jaunaja masiva data elementa un izsaucu ar rekursijas palidzibu savu funkciju velreiz tikai ar jauniem datiem.

 

Ir problema ka vilni kaut ka sabruk un rakstas viena un ta pasha elementa...

 

	[2] => Array
	(
		[0] => IF Vai ir nepieciešama maiņa ? == Jā   
		[1] => THEN Vai pietiek naudas resursu ?
IF Vai pietiek naudas resursu ? == Jā
		[2] => THEN Kādam ir jābūt autobusa dzinējam ?
IF Kādam ir jābūt autobusa dzinējam ? == Benzīna dzinējs
		[3] => THEN Kāds ir nepieciešams autobusu tips ?
IF Kāds ir nepieciešams autobusu tips ? == Turistiskais
		[4] => THEN Kāda režīmā ir jāstrādā ātrumu kastei ? 
IF Kāda režīmā ir jāstrādā ātrumu kastei ?  == Automātiskā
		[5] => RESULT = Šī sistēma nevar Jums palīdzēt
		[6] => THEN Kādam ir jābūt autobusa dzinējam ?
IF Kādam ir jābūt autobusa dzinējam ? == Dizeļdzinējs
		[7] => THEN Kāds ir nepieciešams autobusu tips ?
IF Kāds ir nepieciešams autobusu tips ? == Turistiskais
		[8] => THEN Kāda režīmā ir jāstrādā ātrumu kastei ? 
IF Kāda režīmā ir jāstrādā ātrumu kastei ?  == Automātiskā
		[9] => RESULT = Šī sistēma nevar Jums palīdzēt
		[10] => THEN Kāds ir nepieciešams autobusu tips ?
IF Kāds ir nepieciešams autobusu tips ? == Mikro
		[11] => THEN Kāda režīmā ir jāstrādā ātrumu kastei ? 
IF Kāda režīmā ir jāstrādā ātrumu kastei ?  == Automātiskā
		[12] => RESULT = Šī sistēma nevar Jums palīdzēt
	)

 

	error_reporting(E_ALL);

function show_construct($pgid, $arrid){		
	global $data;	
	$q = mysql_fetch_array(mysql_query("SELECT `condition`, `title`, `next_id` FROM zinashanu_baze WHERE id = ".$pgid." LIMIT 1"));

	if($q['next_id'] != 0){

		if(!isset($data[$arrid])) $data[$arrid] = Array();
		if($pgid && $pgid != 1)
			$data[$arrid][] = '<u>THEN '.$q['title'].'</u><br/><b>IF '.$q['title'].' == '.$q['condition'].'</b>';
		elseif($pgid)
			$data[$arrid][] = '<b>IF '.$q['title'].' == '.$q['condition'].'</b>   ';						

		if(strpos($q['next_id'], '-')===false) show_construct($q['next_id'], $arrid);
		else{
			$ids=explode('-', $q['next_id']);				
			show_construct($ids[0], $arrid);				
			for($i=((abs((int)$ids[0])+1));$i<=abs((int)$ids[1]);$i++) {
				$data [($arrid+1)] = Array();			
				$data [($arrid+1)] = array_merge ($data [($arrid)], $data [($arrid+1)]);						
				show_construct($i, $arrid+1);
			}									
		}			
	}
	else $data[$arrid][] = '<i><b>RESULT = '.$q['title'].'</b></i>';
}

global $data;
$data=Array();
show_construct(0, 0);	

echo '<pre>';
print_r($data);

 

Datu baze izskatas sekojoshi

capture26102008150252ud0.jpg

 

Tekoshais rezultats var but apskatits te

http://78.154.135.181/lis/

Edited by stepan
Link to comment
Share on other sites

Varbūt sāc ar to, ka pārstrukturizē datus, ja dikti vēlies datus glabāt relāciju db. Ievies papildus tabulu, kur ir next_id pret id un tad ar rekursīviem pieprasījumiem vērsies pie db un daboun jau gatavu struktūru.

 

P.S.

Offtopikk, liekas manīju iekš Firebird rekursīvos kverijus, derētu tākā papētīt. Ir kādam pieredze?

Link to comment
Share on other sites

Ja godīgi nemēģināju iedziļināties visā tai kodā, bet ir 2 piezīmes:

1) šeir ir raksts par rekursīvu datu glabāšanu un vaicājumiem MySQLā http://dev.mysql.com/tech-resources/articl...hical-data.html

2) atceries, ka tabulu savienojumi (join) var būt ne tikai ar ekvivaleneces nosacījumu, bet arī jebkādu citu, tai skaitā intervālu, kas iespējams šeit varētu noderēt.

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

Formatam ir jabut - masivs

 

[0] => Array(pirmais IF THEN IF THEN vilnis)

[1] => Array(otrais IF THEN IF THEN vilnis)

[2] => Array(treshais IF THEN IF THEN vilnis)

...

 

Runajot par intervaliem - skaidrs ka var izdarit ta JOIN .. ON (a>5 AND a<10), bet ir problema, ka tur intervals var but gan integer gan varchar, tatad vieglak apstradat ar PHP iespejam. Problema ir masivu veidoshana'. Ir aizdomas ka kaut kas ar indeksiem $arrid vai globalo masivu...

Link to comment
Share on other sites

×
×
  • Create New...