Что с точки зрения непрофессионала - это рекурсивная функция, использующая PHP - PullRequest
71 голосов
/ 16 апреля 2010

Может ли кто-нибудь объяснить мне рекурсивную функцию в PHP (без использования Фибоначчи) на языке неспециалистов и на примерах? я смотрел на пример, но Фибоначчи полностью потерял меня!

Заранее спасибо ;-) Кроме того, как часто вы используете их в веб-разработке?

Ответы [ 17 ]

1 голос
/ 16 апреля 2010

Рекурсия - это альтернатива циклам, они редко придают вашему коду большую ясность или элегантность. Хороший пример был дан ответом Progman: если он не будет использовать рекурсию, он будет вынужден отслеживать, в каком каталоге он в настоящее время (это называется состоянием) рекурсии, позволяет ему вести бухгалтерию, используя стек (область, где переменные и обратный адрес метода сохраняются)

Стандартные примеры факториала и Фибоначчи бесполезны для понимания концепции, поскольку их легко заменить циклом.

0 голосов
/ 31 января 2019

Я тоже не нахожу примеры полезными. Вы не можете решить две проблемы одновременно, когда математика вовлечена, ваш ум переключается между двумя проблемами. Хватит говорить

Пример:

У меня есть функция, где я взрываю строки в массив на основе : разделителя.

public function explodeString($string)
{
  return explode(":", $string);
}

У меня есть другая функция, где я принимаю строки в качестве ввода

public function doRec()
{
    $strings = [
        'no:go',
        'hello:world',
        'nested' => [
            'iam:good',
            'bad:array',
            'bad:how',
            'bad:about',
        ]
    ];

    $response = [];

    foreach ($strings as $string) {
        array_push($response,$this->explodeString($string));
    }

    return $response;
}

Проблема в том, что у моего ввода есть вложенный массив, а моя explodeString функция получает тип string. Я могу переписать некоторый код в функции explodeString, чтобы приспособиться к этому, но мне все еще нужна та же функция для выполнения той же операции над моей строкой. Вот где я могу вызвать метод recursively внутри. Итак, вот последняя функция explodeString с рекурсией.

public function explodeString($string)
{
    if (is_array($string)) {
       $combine = [];
       foreach ($string as $str) {
           array_push($combine, $this->explodeString($str));
        }
       return $combine;
    }

    return explode(":", $string);
}
0 голосов
/ 02 марта 2018

рекурсия, используемая для константы Капрекара

function KaprekarsConstant($num, $count = 1) {
    $input = str_split($num);
    sort($input);

    $ascendingInput  = implode($input);
    $descendingInput = implode(array_reverse($input));

    $result = $ascendingInput > $descendingInput 
        ? $ascendingInput - $descendingInput 
        : $descendingInput - $ascendingInput;

    if ($result != 6174) {
        return KaprekarsConstant(sprintf('%04d', $result), $count + 1);
    }

    return $count;

}

Функция продолжает вызывать себя с результатом вычисления, пока не достигнет константы Капрекарса, при которой она будет возвращать количество раз, когда были выполнены вычисления.

/ edit Для любого, кто не знает константу Капрекара, ему нужно ввести 4 цифры, по крайней мере, с двумя разными цифрами.

0 голосов
/ 07 января 2017

Работает простой рекурсивный пример (Y)

<?php 


function factorial($y,$x) { 

    if ($y < $x) { 
        echo $y; 
    } else { 
        echo $x; 
        factorial($y,$x+1);
    } 
}

$y=10;

$x=0;
factorial($y,$x);

 ?>
0 голосов
/ 15 сентября 2015

Это очень простой пример факториала с рекурсией:

Факториалы - это очень простая математическая концепция. Они написаны как 5! а это значит 5 * 4 * 3 * 2 * 1. Итак 6! это 720 и 4! 24.

function factorial($number) { 

    if ($number < 2) { 
        return 1; 
    } else { 
        return ($number * factorial($number-1)); 
    } 
}

надеюсь, это полезно для вас. :)

0 голосов
/ 21 июля 2014

Если вы добавите определенное значение (скажем, «1») к примеру Энтони Форлони, все будет ясно:

function fact(1) {
  if (1 === 0) { // our base case
  return 1;
  }
  else {
  return 1 * fact(1-1); // <--calling itself.
  }
}

оригинал:

function fact($n) {
  if ($n === 0) { // our base case
    return 1;
  }
  else {
  return $n * fact($n-1); // <--calling itself.
  }
}
0 голосов
/ 05 июля 2014

Хороший пример - прогулка по дереву каталогов. Вы можете сделать что-то подобное для обработки массива. Вот действительно простая рекурсивная функция, которая просто обрабатывает строку, простой массив строк или вложенный массив строк любой глубины, заменяя экземпляры 'hello' на 'goodbye' в строке или значениях массива или любого вложенный массив:

function replaceHello($a) {
    if (! is_array($a)) {
        $a = str_replace('hello', 'goodbye', $a);
    } else {
        foreach($a as $key => $value) {
            $a[$key] = replaceHello($value);
        }
    }
    return $a
}

Он знает, когда выйти, потому что в какой-то момент обрабатываемая им вещь не является массивом. Например, если вы вызываете replaceHello («привет»), он вернет «до свидания». Если вы отправите ему массив строк, хотя он вызовет себя один раз для каждого члена массива, то вернет обработанный массив.

...