Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> rekurencja na iterację
MitS
post
Post #1





Grupa: Zarejestrowani
Postów: 262
Pomógł: 5
Dołączył: 8.02.2005
Skąd: Olsztyn / Zatorze

Ostrzeżenie: (0%)
-----


Witam serdecznie,


mam taki oto problem.
chciałbym zamienić taki kod:

  1. <?php
  2. function funA($x){
  3.    if(0 == $x)
  4.        return 0;
  5.    
  6.    return $x * funB(1 ^ ($x >> 1));
  7. }
  8.  
  9. function funB($y){
  10.    if(0 == $y)
  11.        return 1;
  12.    
  13.    return $y + funA($y - 1);
  14. }
  15.  
  16. echo funA(5);
  17. ?>


na postać iteracyjną ale nie wiem jak się za to zabrać, gdyż jak piszę jakieś pętle to zawsze sprowadza mi się kod do rekurencji :/
Prosił bym o pomoc.

Ten post edytował MitS 15.07.2009, 21:50:38
Go to the top of the page
+Quote Post
grn
post
Post #2





Grupa: Zarejestrowani
Postów: 25
Pomógł: 4
Dołączył: 1.06.2009

Ostrzeżenie: (0%)
-----


Często przy usuwaniu rekurencji trzeba implementować własny stos. W tym przypadku możemy napisać:

  1. <?php
  2. function fn($x)
  3. {
  4.  $stack = array();
  5.  
  6.  while(true)
  7.  {
  8.    array_push($stack, $x);
  9.    if($x == 0)
  10.    {
  11.      break;
  12.    }
  13.  
  14.    $y = (1 ^ ($x >> 1));
  15.    array_push($stack, $y);
  16.    if($y == 0)
  17.    {
  18.      break;
  19.    }
  20.  
  21.    $x = $y - 1;
  22.  }
  23.  
  24.  $ret = (count($stack) % 2 ? 0 : 1);
  25.  if($ret == 0)
  26.  {
  27.    array_pop($stack);
  28.  }
  29.  
  30.  while(!empty($stack))
  31.  {
  32.    $ret += array_pop($stack);
  33.    $ret *= array_pop($stack);
  34.  }
  35.  
  36.  return $ret;
  37. }
  38. ?>


Pierwsza pętla odkłada argumenty przekazywane do funkcji funA i funB. Gdy po jej wykonaniu na stosie znajduje się nieparzysta ilość elementów, to ostatnim wywołaniem rekurencyjnym było wywołanie funkcji funA. Wtedy wykonujemy pojedyncze działanie. Na stosie pozostaje parzysta ilość elementów. Druga pętla oblicza wartości zwracane przez poszczególne wywołania.
Go to the top of the page
+Quote Post
MitS
post
Post #3





Grupa: Zarejestrowani
Postów: 262
Pomógł: 5
Dołączył: 8.02.2005
Skąd: Olsztyn / Zatorze

Ostrzeżenie: (0%)
-----


dzięki bardzo, w ogóle nie brałem pod uwagę stosu dlatego nie wychodziło biggrin.gif
Pozdrawiam
Go to the top of the page
+Quote Post
Zyx
post
Post #4





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Jeśli masz PHP 5.3, to użyj struktur danych dostępnych w SPL-u. O rekurencji swego czasu pisałem u siebie na blogu (niestety, SPL nie miał jeszcze wtedy struktur danych):

http://www.zyxist.com/pokaz.php/pozbadz_sie_rekurencji


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 06:36