Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: rekurencja na iterację
Forum PHP.pl > Forum > PHP
MitS
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.
grn
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.
MitS
dzięki bardzo, w ogóle nie brałem pod uwagę stosu dlatego nie wychodziło biggrin.gif
Pozdrawiam
Zyx
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.