Вопрос №3021 от пользователя Владимир Волков в уроке «Функции первого класса. Передача функций как аргументов», курс «PHP: Построение абстракций»

Владимир Волков

Почему не срабатывает такой код, на бумаге вроде срабатывает)

`function product($num1, $num2, $func)
{
    // BEGIN (write your solution here)
    if ($num1 > $num2) { return 0; }
    return $func($num1, product($num1+1, $num2, $func));
    // END
}`
There was 1 failure:

1) App\TestSolution::testProduct
Failed asserting that 4 matches expected -6.

/usr/src/app/TestSolutions.php:30

FAILURES!
Tests: 2, Assertions: 6, Failures: 1.
make: *** [test] Error 1
make: Leaving directory `/usr/src/app'
9 0

Kirill Mokevnin

/usr/src/app/TestSolutions.php:30 а вы смотрели на эту строчку? На каких данных у вас возвращает 4 вместо -6 ?

0

Владимир Волков

function product($num1, $num2, $func($num1, $num2) {return $num1 - $num2;})
{
    // BEGIN (write your solution here)
    if ($num1 > $num2) { return 0; }
    return $func($num1, product($num1+1, $num2, $func));
    // END
}

Данные эти: product(3, 5, $func($a, $b) {return $a - $b;}) получается так:

3 - product(3+1, 5, $func)
3 - 4 - product(4+1, 5, $func)
3 - 4 - 5 - product(5+1, 5, $func)
3 - 4 - 5 - 0  = -6  
0

Владимир Волков

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

согласно тестов получается 4, у меня -6

0

Kirill Mokevnin

Оказывается у нас на сайте была выложена старая версия упражнения с ошибкой(. Обновил версию. Попробуйте сбросить прогресс и все должно получиться. Извините что сбили вас с толку.

1

Alexander Alexandryan

хм, я тоже хотел решить с прибавлением последовательности, но у меня и тесты показывают 4 и на локалке)

0

Alexander Alexandryan

Перед return в func стоит добавить echo $a. " - ".$b."<br>"; для дебага, и тогда видно что работает вовсе не так:

Данные эти: product(3, 5, $func($a, $b) {return $a - $b;}) получается так:

3 - product(3+1, 5, $func) 3 - 4 - product(4+1, 5, $func) 3 - 4 - 5 - product(5+1, 5, $func) 3 - 4 - 5 - 0 = -6

0

Alexander Alexandryan

Кирилл, объясните?

0

Alexander Alexandryan

Вроде разобрался, дело в том что если делать return $func($num1, product($num1+1, $num2, $func)); то получится 3 - 4 - 5 - 0 , только операции вычения происходят начиная с самой глубокой, тоесть с права на лево, 5-0= 5, 4-5=-1, 3 -(-1)=4..а в случае с вычетанием от num2 получаем - 3-(5-1)=-1, -1-5=-6 (5 получили потому что 3==3 подставляем 5)

2

Kirill Mokevnin

Круто! -)

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
25 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
25 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
25 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев