Search
Write a publication
Pull to refresh
-9
0
Send message

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

"Вы можете переписать её на обычную функцию без всяких генераторов."

Напишите что-бы при последнем вызове она возвращала строку 'Отсчет закончен'. Дежавю.

Мне к сожалению запретили писать чаще чем раз в час.

Я удалил маленький кусочек статьи, который состоял больше чем на половину из документации, где я делаю выводы про генераторы в разрезе памяти PHP. И статья не теряет своей целостности.

Обратите внимание что я в который раз признаю что привел плохой пример. Не думал что модерацию статья пройдет так быстро.

Но давайте отвлечемся от генераторов и взглянем еще раз на название статьи.

Как будто бы мы в комментариях как в рекурсии.

Честно, не понимаю откуда столько минусов. Я не утверждал что нашел что-то новое, хотел сказать что новое, как бы это очевидно не звучало, надо искать.

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

К слову статья не называется "я нашел новый алгоритм". Статья про то как я использовал язык по другому. Что я в ней и подчеркиваю.

Посмотрите статью. Если помните, раньше я упоминал документацию, сейчас этого упоминания в статье у меня нету. Что-бы не вводить читающих в заблуждение. В первом случае у нас вызывается параллельная рекурсия, а потом, другой вид рекурсии. Наверное это и есть хвостовая, про которую вы пишете. Используя гибкость функции-генератора мы добились этих изменений. Гибкость которую нам дает генератор в отличии от функции.

Думаю у меня получилось! Попробуйте код и посмотрите стек вызова:

<?php

function fibGenerator($n) {

    if ($n === 0) {

        yield $n;

        return;

    } else {

        yield $n + ($n - 1);

    }

    yield from fibGenerator($n - 1);

}

foreach (fibGenerator(7) as $x) {

    var_dump($x);

}

Да, считает он не то что нужно, правильной вариант я доработаю и допишу в статью.

Наконец-то я понял о чем вы говорите. И вы абсолютно правы, в статье я выигрываю в производительности и стеке за счет цикла while, а не из-за использования генератора. Завтра отредактирую публикацию и приведу нормальный пример.

Когда вы вызовите функцию в 8 раз. Функция в своем теле еще раз "вызывает" себя. После выполнения вызова она вернет вам строку. В кавычки я беру слово "вызвал" потому-что используя обычные функции вы этого поведения не добьетесь. Но вот функция-генератор так может. Более правильно будет сказать так - генератор обратился к своей функции (вызвал)

Давайте вернемся к примеру из комментариев выше и дополним его что-бы было понятно что я хочу показать. Смотрите:

<?php

fib()
fib()
fib()
fib()
fib()
fib()
$fib_result = fib()
$string_result = fib()

Немного упростим задачу. Попробуйте что-бы на 8 вызов функции, она "вызывала" себя же и вы получили в переменную $string_result строку 'Ответ выведен'.
P.S. Сравнивать функции и генераторы не совсем корректно. Они взаимосвязаны, но функция описывающая генератор это его часть, что очень важно понимать. Попробуйте добиться этого поведения через генератор.

Проше говоря рекурсия, про что я сразу и упомянул.

Я вам и пишу - попробуйте на последний вызов функции после подсчета чисел Фибоначчи из этой-же функции вызвать себя и получить строку "Ответ выведен".

Код в статье не решает проблем, он скорее их поднимает, если можно так выразиться. Я думаю если вы прочитаете мою статью параллельно подкрепляя практикой вы сможете написать эту функцию.

Что-бы попробовать что такое генераторы в PHP. И причем здесь рекурсия.

Спасибо что помогли мне придумать хороший пример к статье.

Теперь попробуйте что-бы на последний вызов (любой, не только седьмой) функции она вызывала себя (к слову о рекурсии), но результат ее был "Ответ выведен"

Это моя оговорка, конечно генератор не вызывает сам себя. Что такое генератор я привожу в статье как цитаты из документации.
Думаю что-бы понять о чем я говорю вам нужно чтобы вы написали такую функцию которая после 7 вызовов, вот так:
<?php

fib()
fib()
fib()
fib()
fib()
fib()
$fib_result = fib()

Вернет вам правильное значение из ряда чисел в переменной $fib_result. Цикл while в примере это всего лишь обертка этого вызова.

Постараюсь рассказать в следующей статье.

Мне кажется вы не до конца выделили главную мысль 2 пункта вашего комментария. "Совершенно ненужный здесь генератор.". Здесь это где? В комментариях где я не могу вам объяснить что не важен получаемый результат. В пример я не привожу результат функции, я привожу стек вызова функции! Напишите функцию которая за 7 вызов подряд самой себя, прошу заметить без входных параметров, даст вам число из последовательности Фибоначчи. - это будет примером а не цикл while, он тут вообще роли не играет, как и результат, скажу еще раз, на всякий случай. Вот вам будет задачка на вечер.
Но опять же эта функция последовательности Фибоначчи может получится у вас и без генератора, например через анонимную функцию и замыкание, да хоть на листке с бумажкой посчитайте, результат тут не важен. А в статье генератор нужен по конкретно описанной мной причине.

Не могу прокомментировать ваш код по причине того что не знаю как генератор выглядит под капотом языка который будет компилировать пример.
Перед написанием статьи я обращался в git-репозиторий движка Zend и посмотрел как выглядят генераторы там. Что собственно и толкнуло меня на написание статьи. И опять же, дело не в результате, дело в том каким способом мы используем PHP что-бы получить этот результат.

Я вам говорю про стек вызова, вы мне про результат функции. Зачем?

1

Information

Rating
Does not participate
Registered
Activity

Specialization

Backend Developer
Middle
Git
SQL
OOP
Docker
PHP
Golang