Этот урок набрал набрал достаточно большое количество
комментариев и дальнейшее его комментирование отключено.
Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку,
посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали.
Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
Принято! Отличный вариант. Однако можно чуть упростить - как я говорил, функция может и вовсе ничего не возвращать. В итоге всё можно свести к следующему коду:
У меня на первом уровне погружения 5, потом 4, потом 3... Дохожу до нуля. Условие выполняется, вывожу 0. Поднимаюсь на уровень выше, следов для $x = 1 выполняется:
echo ', ' . $x;
Тут функция завершает свою работу. Возвращаюсь еще на уровень выше. там $x = 2.
Вывожу 2. И в итоге дохожу до 5. Вывожу его. Функция завершается. Возвращаюсь к месту, где она изначально была вызвана с параметром 5. Дальше кода нет. Работа скрипта завершается.
Потому что именно при нуле сработает первый echo. Затем мы выполним return и вернемся на уровень выше, где в функцию была передана единица. После вызова функции с передачей в неё нуля идет строка, которая выведет единицу. И так далее. Если сейчас нет понимания - ничего страшного. Тема рекурсии не сразу дается. Дождитесь следующего урока, там точно станет понятнее, обещаю =)
Нет, в функцию передаётся как раз в обратном порядке: 5, 4, 3...
Посмотрите следующий урок про отладку приложений, должно стать понятнее. Там тоже будет рекурсия.
Не могу понять как работает это выражение :( $x * power($x, $n - 1), т.е я понимаю, что под этим скрывается 2 * power(2, 2), но как происходит умножения двойки на функцию с двумя аргументами? Как двойка выбирает на какой аргумент умножать? Действительно мозги закипают!)
А зачем вы сделали приведение к float при определении переменных? И нужно добавить приведение к типу в аргументах функции. А в целом - алгоритм верный.
function x2(&$x, &$y) {
$x *= 2;
$y *= 2;
}
$a = 5;
$b = 20;
echo "Первое число: $a. Второе число: $b. <br/>";
x2($a, $b);
echo "Первое число после выполнения функции: $a. Второе число после выполнения функции: $b. <br/>";
А вы запустите код в отладчике, и всё поймёте =) Вы же смотрели урок про отладку с помощью XDebug?
P.S. код после блока if {...} не надо заключать в фигурные скобки. Это бессмысленно. Просто продолжайте писать функцию дальше без скобок.
Предпочтительнее - оформлять код с помощью markdown-разметки, вот так:
```
код
```
Как и у большинства начинающих - проблема с отступами и оформлением. Почитайте про Reformat Code в PhpStorm. Закрывающий тег в конце не нужен.
Задание сделано неверно, перечитайте внимательно.
<?php
function factorialOfNumber ($number){
var_dump($number);
echo '<br>'.'<br>';
if($number == 0){ // если равно 0 то программа завершает рекурсию
return 1;
}
return $number * factorialOfNumber($number-1); // число умножаем на число, после прохождения условия вычитается один
}
$a = 5;
echo 'Факториал числа ' . $a .' = '. factorialOfNumber($a);
2 раза пересматривал видео урок чтобы понять=)
В комментарии не смотрел, крутые курсы все достаточно понятно, было бы круто если бы задач было побольше.
4 Задача
<?php
function getSumOfNumbersFromZero($nmin,$nmax)
{
echo 'Число: ' . $nmin . '<br>';
//если минимально значение не равно максимальному продолжается проверка условия
if($nmin==$nmax){
return;
}
// прибавляем в рекурсии +1 к минимальному значению
// пока минимальное значение не станет равным максимальному и условие if выполнится
return getSumOfNumbersFromZero($nmin+1,$nmax);
}
echo getSumOfNumbersFromZero(0,10);
Он их не подбирает. Если их не указать, то они придут как есть. Это плохо, когда в аргументах может прийти что угодно. Это приводит к большему числу ошибок.
<?php
//Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
//Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
//Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)
//Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание
// повышенной сложности. Кто справится и первым напишет верное решение в комментах – тот красавчик и получит от проекта небольшой бонус.
//__________________________________________________________________
echo '<b>1-е задание</b></br>';
function minimumNumber(float $x, float $y, float $z)
{
if ($x > $y) {
$minimum = $y;
} else
{
$minimum = $x;
}
if ($minimum > $z)
{
return $z;
} else
{
return $minimum;
}
}
$a = 1.27;
$b = 1.26;
$c = 1.25;
echo 'Минимальное число будет равно '.minimumNumber($a, $b, $c);
echo "</br>";
//_______________________________________________________________
echo '<b>2-е задание</b></br>';
function multiplication(&$a)
{
$a = $a*2;
}
$x = 100;
$y = 200;
multiplication($x);
echo "x = $x <br/>";
multiplication($y);
echo "y = $y </br>";
//___________________________________________________________________
echo '<b>3-е задание</b> </br>';
function faktorialOfNumbers(int $x)
{
echo "$x *";
if ($x <= 1)
{
return 1;
}
return $x * faktorialOfNumbers($x-1);
}
$a = 5;
echo 'Факториал числа '.$a.' = '.faktorialOfNumbers($a).'</br>';
//__________________________________________________________________
echo '<b>4-е задание</b></br>';
function getMaxNumberFromZero(int $min, int $max)
{
echo "Число $min</br>";
if ($min == $max)
{
return ;
}
return getMaxNumberFromZero($min + 1, $max);
}
$min = -10;
$max = 10;
echo 'Вывод чисел от '.$min.' до '.$max.'</br>';
echo getMaxNumberFromZero($min, $max);
C последней функцией повышенной сложности не справилась (( Рассмотрела, как решили другие, все вроде бы понятно, но вот сама не дошла до этого, увы. Фун №1
Начиная с PHP 5.3.0, вы можете получить предупреждение о том, что передача переменной по ссылке устарела, если используете & в foo(&$a);. Начиная с PHP 5.4.0 передача переменной по ссылке стала невозможна, поэтому использование этого приема приведет к фатальной ошибке.
<?php
// Найти минимальное число из трех
function minNum($a, $b, $c)
{
if ($a < $b) { // Сравниваем первые два числа
$num = $a; // Если а меньше b, записываем число в переменную num
} else {
$num = $b; // Если b меньше a, записываем число в переменную num
}
if ($num < $c) // Наименьшее число из первого сравнения сравниваем с третьим числом
return $num;
else {
return $c;
}
}
$a = 2;
$b = 6556;
$c = 55;
echo minNum($a, $b, $c); // ывод
// Произведение целых чисел от единицы до переданного
function fuctNum($a)
{
if ($a == 1) { // Если переданное число больше 1, вернуть значение
return $a;
} else {
return $a * fuctNum($a - 1); // Умножение
}
}
$a = 5;
echo fuctNum($a);
// Вывод на экран целых чисел от 0 до переданного значения
function funInter($a)
{
if ($a >= 0) {
funInter($a - 1); // Уменьшаем заданное число на единицу
echo $a . '</br>'; // И выводим каждое новое число из предыдущей операции с новой строки
} else {
return;
}
}
funInter(15);
function funInter($a)
{
if ($a >= 0) {
funInter($a - 1); // Уменьшаем заданное число на единицу
echo $a . '</br>'; // И выводим каждое новое число из предыдущей операции с новой строки
} else {
return;
}
}
Всё норм, но непонятно зачем во втором вы возвращаете строку из двух склеенных чисел. По поводу четвертого - переходите к следующему уроку, будет понятнее.
Нужно указывать return-type для функции, через двоеточие, как в уроке.
3 - а где обработка случая, когда не больше единицы? Вам повезло, что null преобразовался в 0. Факториал - это произведение а не сумма.
4 - в именах функций в современном PHP не используются подчеркухи. Потому что выражение сначала вычисляется, а затем выводится. Самым первым будет вычислено выражение для нуля, оно же и выведется первым.
ну не работает же, ёлки-палки - функция называется Factorial (что некорректно - все имена функций должны начинаться с маленькой буквы), а вызывается и в теле, и снаружи getFactorial.
после блока с return необязательно ставить elseif - если верхнее условие выполнится, то функция не пойдет дальше, поэтому лучше просто if c новой строки:
function factorial (int $a): int
{
if ($a === 0) {
return $a + 1;
}
if ($a === 1) {
return $a;
}
return $a * factorial($a - 1);
}
Для чего здесь переменная str? Зачем в конце что-то возвращать и выводить результат функции, если она внутри своего тела выводит нужные данные.
Почему не указали типы аргументов? Где тип возвращаемого значения?
И почему не сделали как написано в задании, через рекурсию?
Немного застрял поначалу в первой задаче по минимуму из трёх значений.
Посмотрел следующий урок по Xdebug, вернулся и для большего понимания сделал такой код:
На выходе получается меньшее из трёх. Ух, спасибо, Артём, такие уроки мощно прочищают мозги, заставляют заново крутиться заржавевшие механизмы. Осталось запомнить слово "тернарный"))
Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)
function factorial($a)
{
if ($a == 1) {
return $a;
}
return $a * factorial($a - 1);
}
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности. Кто справится и первым напишет верное решение в комментах – тот красавчик и получит от проекта небольшой бонус. UPD: первым справился человек с ником omk. Вариант его решения вы можете увидеть в комментариях.
Функция всегда должна возвращать минимальное значение и не должна ничего выводить. Если все значения равны, значит минимальное значение - это значение любого из этих чисел.
Потому что он в выражении выполняется раньше всего остального. Он уменьшает n ещё до того как оно умножается на правую часть выражения. Для того чтобы это понять нужно изучить приоритеты операторов в PHP.
<?php
function power($x, $n)
{
var_dump($x, $n);
// Если сейчас степень равна единице, то возвращаем само это число
if ($n == 1) {
return $x;
}
// В остальных случаях - умножаем число на возведённое в степень n - 1 и возвращаем его
return $x * power($x, $n - 1);
}
echo 'Результат: ' . power(2, 3);
Вывод получится следующим:
int 2 int 3
int 2 int 2
int 2 int 1
Результат: 8
Откуда вы взяли значения в выводе? Это типо было 2 в стпени 3, потом стало 2 в степени 2 и умножить на 2 и т.д.?
//Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
function threeNumbers(float $x, float $y, float $a)
{
if ($x < $y) {
$min = $x;
} else {
$min = $y;
}
if ($min < $a) {
return $min;
} else {
return $a;
}
}
$x = 33.3;
$y = 5.3;
$a = 11.2;
echo '<br>' . 'Минимальное значение: ' . threeNumbers($x, $y, $a);
Разобрался, вроде теперь правильно все выводит. Получается у меня не была объявлена переменная $min , а я уже выводил ее через return. Сначала мы объявляем переменную(новую), если мы присваиваем ей наши аргументы в функции; потом совершаем уже действия и только в конце выводим результат.
Второе число не умножается на 2
Если навести на х то будет написано
Unused parameter 'x'. The reference stored in the parameter is not used anywhere. less... (Ctrl+F1)
Inspection info: A parameter is considered unused in the following cases:
Parameter is passed by value and the value is not used anywhere or is overwritten immediately.
Parameter is passed by reference and the reference is not used anywhere or is overwritten immediately.
Правильно ли я понимаю, что возвращать, это означает, выводит на экран в браузере? В скорректированной версии кода, на экран выводится именно числовое значение "$y . ' минимальное значение'".
Типы аргументов указал function minNumber(float $x, float $y, float $z)
Немного не понял, в этом примере мы создали функцию getSum, у неё в качестве аргументов две переменные, $x и $y, с этим ясно, вот только не пойму, если функция возвращает сумму этих переменных, каким боком она же потом и возвращает сумму переменных $a и $b? Или тут подразумевается, что переменные $a и $b выступают в качестве значений переменных $x и $y?:
Перечитайте урок. В одном случае это аргументы функции, доступные только внутри функции. В другом - переменные, о которых функции ничего не известно. Почитайте в официальной документации об области видимости в PHP.
это к вопросу об области видимости итд.
Вы мой вопрос просто не поняли. Я просто хотел уточнить, что, если мы функцию написали, и её аргументы, к примеру, в общем виде, две переменные $x и $y, то мы потом можем эту функцию многократно использовать, подставляя вместо аргументов любые другие значения и она будет работать или как? То есть, как я это понимаю, поправьте если не прав, имеем функцию:
function getSum($x, $y)
{
return $x + $y;
}
при вызове функции мы ей передаём значения для её аргументов (не важно, статикой или по ссылкам, не суть, сейчас главное понять смысл), эти значения заменяют значения аргументов в изначальном коде функции и они же подставляются в какой-то исполняемый код в её теле, так?
Да, передавать разные аргументы вы можете сколько угодно раз. Имена переменных внутри функции никак не связаны с именами переменных за её пределами. Они могут быть как одинаковыми, так и разными по имени.
"Использовать функцию можно только после кода её определения!"
Разве нельзя сначала ее использовать, а потом объявить? Просто так тоже работает, и вроде как программа при компиляции проходит по коду два раза, первый раз для поиска переменных и функций, а второй раз уже исполняет программу.
Все что после if и else берется в фигурные скобки.
Последний блок else не нужен - просто выполнится в конце, если первые два условия не выполнились.
При входных параметрах
minFloat(0.24, 0.24, 0.25)
говорит, что минимальное 0.25 - неправильно
ОК
Все что после if и else берется в фигурные скобки. Где уже нахватались кода без них?
Всегда используйте фигурные скобки в блоках условий - это стандарт в PHP. Если x и y не являются минимальными, то не надо проверять что z меньше y. Это единственный оставшийся вариант.
Перечитайте задание второй задачи.
ОК. Но если передать -3, то после 0 не будет запятой.
Исправьте отступы в первом задании, ничего не понятно. Переносите все на новые строки, как в уроках. С факториалом та же история. В шторме можно просто нажать CTRL+ALT+L и он сам все отформатирует как надо.
В четвертом задании не нужно использовать exit, это завершает работу всего скрипта. Вам же нужно просто завершить работу функции.
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
С задачей №4 не справился. Почитав комменты, разобрался) Следующим уроком надеюсь закреплю знания по рекурсии! Спасибо большое за уроки, все очень доступно и понятно! За домашку отдельное спасибо!
Так нельзя. Прочитайте официальную документацию о приоретизации операторов. Здесь выполняется проверка на то что:
($a меньше либо равно $b) И (значение $c, приведенное к булеву типу == true)
function doubleVar(&$a, &$b) {
Забавно, перед отправкой я вспомнил про типы, но потом почему-то решил, что раз это ссылки, то тут типы не нужны) Собственно, я ждал этого коммента, спасибо)
Это третья задача. Поясните, пожалуйста, вот эта строка в вашей лекции о рекурсии 'return $n + getSumOfNumbersFromZero($n - 1);' означает какой-то цикл? Так как последовательно складывает все числа. Я не понимаю как он узнает, что нужно еще складывать и еще... Пока не будет 1. Т.е. почему он продолжает считать дальше? Мог бы прибавить $n к функции с ($n-1) и на этом остановиться.
Объясните, пожалуйста, как работает код ниже. Если можно построчно что он делает. Не понимаю как он выводит числа по порядку.
<?php
declare(strict_types=1);
function numbers(int $num) {
if ($num > 0) {
numbers($num - 1); //Здесь он посчитал, что 5-1=4
}
echo $num;//А здесь должен вывести 4. И все. Почему он начинает выводить цифры с нуля?
return;//И почему вообще начинает искать другие числа, а не останавливается на 4?
}
numbers(5);
Функция должна возвращать число, а не строку. При следующих входных данных:
echo getFloat(12.4,12.4,23.5);
возвращает
less all:23.5
что неправильно.
Фигурная скобка, открывающая тело функции, ставится на следующей строке после объявления имени и аргументов.
Функция должна изменить значения аргументов, а не вывести их умноженными на два. То есть после вызова функции значения обеих переменных должны увеличиться на 2.
ОК
Для чего в конце возвращается $a? Это где-то используется?
По поводу вашего вопроса - в настройках PHPStorm нужно выставить версию PHP не ниже 7.0.
Первое задание. Стараюсь пока не смотреть подсказки в чате, поэтому наверно много лишнего, когда уже вижу что работает как надо, смотрю варианты для упрощения) Но тут выкладываю что сам навыдумывал для честности.
Нет, необязательно. Но вы сам написали :int в её объявлении. Если написан тип возвращаемого значения, значит должен быть return. Исключение - void. Как раз ваш случай.
Потому что написать простой код сложнее, чем написать сложный код) Всё хорошо, только имена функций должны начинаться с маленькой буквы. Это стандарт PSR.
Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2. Решение:
<?php
#Функция принимает на вход два аргумента по ссылкам и умножает каждый из них на два
function multip2(int &$x, int &$y)
{
$x = $x * 2;
$y = $y * 2;
}
$a = 10;
$b = 7;
multip2($a, $b);
echo $a . '<br>';
echo $b;
<?php
#Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного)
#Ну разумеется, тут никуда без рекурсии
function factorial(int $x)
{
if ($x == 1) {
return 1;
}
return $x * factorial($x - 1);
}
echo factorial(4);
<?php
# Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения.
# И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
# Кто справится и первым напишет верное решение в комментах – тот красавчик и получит от проекта небольшой бонус.
function intNumber (int $x)
{
if ($x == 0) {
echo $x;
} else {
echo $x - intNumber($x - 1);
}
}
intNumber(6.7);
$number_1 - в именах переменных не должно быть подчеркиваний.
Функцию поиска минимального числа рекомендую написать самостоятельно, хотя формально с заданием вы справились.
ArgumentsByReference - имена методов и переменных пишутся с маленькой буквы.
Почему при вызове функции внутри себя самой записывается только результат аргументов? Хотя внутри функции также есть выражение, но его просто игнорируют, когда функция вызывает саму себя.(см. код)
Последнее задание не мог решить, не учёл, что работа функции приостанавливается на время вызова из неё другой функции, так может и додумался бы. Добавьте пожалуйста этот нюанс в урок, для будущих таких же тугодумов как я)
function minFloat (float $x, float $y, float $z)
{
if ($x<$y && $x<$z) {echo $x . ' меньшее' . '</br>'; return;}
elseif ($y<=$z) {echo $y . ' меньшее' . '</br>'; return;}
else {echo $z . ' меньшее' . '</br>'; return;}
}
function multi (&$x, &$y)
{
$x*= 2;
$y*= 2;
}
function getFactorialis(int $n) // скопировал с урока и слегка изменил
{
// Если сейчас 1, то просто возвращаем 1
if ($n == 1 || $n == 0) return 1; //Факториал нуля, по соглашению, принят равным единице: 0!=1.
if ($n < 1) { return false;}
// В остальных случаях - прибавляем текущее число к сумме всех предыдущих
return $n * getFactorialis($n - 1);
}
$x = 2.8;
$y = 5.7;
$z = 8.3;
minFloat($x, $z, $y);
echo 'Было x = ' . $x . ' y= ' . $y . '</br>';
multi($x, $y);
echo 'Стало x = ' . $x . ' y= ' . $y . '</br>';
if ($f = getFactorialis($z)) {echo 'Факториал ' . (int) $z . ' : ' . $f;}
else echo 'Для работы функции вычисления факториала введите число равное или больше 0!';
?>
Как-то сложно. Тут достаточно простых сравнений. Имена переменных ни о чем не говорят. Имена переменных в PHP всегда должны начинаться с маленькой буквы.
Начнем с того, что это вообще не функция. Рекурсия нужна в этом задании обязательно. Для того, чтобы вы понимали как это работает. Ну и, наконец, логика реализации никак не соотносится с логикой задачи.
<?php
function num($x) {
if($x==0){
return 0;
}
return num($x-1);
}
echo ',' .num(10);
попробовал так, что то не работает, хотя по логике вроде как должно. Подскажи пожалуйста в чем не правда?
/*Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения.
И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности. */
<?php
function getNumbers(int $n) {
switch($n<=>0){
case 0: return 0;
break;
case 1: return getNumbers($n-1)."\n".$n;
break;
case -1:return getNumbers($n+1)."\n".$n;
break;
}
}
echo getNumbers(-5);
<?php
/*
* Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
*/
function getMaxValue(float $value1, float $value2, float $value3): float
{
$maxValue = 0.0;
for ($i = 1; $i < 4; $i++) {
$arg = "value{$i}";
if ($maxValue < $$arg) {
$maxValue = $$arg;
}
}
return $maxValue;
}
function getMaxValueUnlimArg(...$_): float
{
$numArgs = func_num_args();
$argList = func_get_args();
$maxValue = 0.0;
for ($i = 0; $i < $numArgs; $i++) {
if ($maxValue < $argList[$i]) {
$maxValue = $argList[$i];
}
}
return $maxValue;
}
var_dump(getMaxValue(5.3, 13.2, 10));
var_dump(getMaxValueUnlimArg(4.3, 9.2, 18.9));
/*
* Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
*/
function multiplyValue(&$value1, &$value2): void
{
$value1 *= 2;
$value2 *= 2;
}
$value1 = 4;
$value2 = 7;
multiplyValue($value1, $value2);
var_dump($value1, $value2);
/*
* Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного).
*/
function getFactorial(int $n)
{
if ($n === 1) {
return 1;
}
return $n * getFactorial($n - 1);
}
var_dump(getFactorial(10));
/*
* Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не
* обойтись без рекурсии, это задание повышенной сложности. Кто справится и первым напишет верное решение в
* комментах – тот красавчик и получит от проекта небольшой бонус.
*/
function showNumberFromZero(int $n)
{
if ($n === 1) {
echo 1;
return 0;
}
showNumberFromZero($n - 1);
echo ', '. $n;
}
showNumberFromZero(10);
Storm ругался на скалярные типы и не давал указать их. Говорил, что только в 7-ой версии доступно и выдавал ошибку синтаксиса, а тут уже 7.4 подъехала. Вот я и решил, что пока так. Да и debug вчера не работал. Вроде исправил. Так?
Скобка, открывающая тело функции, переносится на следующую строку. Где типы аргументов? Как будто урок и не читали. Исправьте, потом остальное посмотрю.
Функция должна возвращать ЧИСЛО! А не строку. Если передать 2, 2, 3, то напишет про 3, что тоже неверно.
Где типы аргументов?
Ок
Функция должна выводить просто последовательность чисел. У вас там суммирование какое-то, дичь в общем.
Рекурсия нужна при обходе древовидных структур данных, при работе с вложенными сущностями. Ну и в математических вычислениях тоже порой позволяет упростить код. Что выбирать, цикл или рекурсию, решает разработчик.
Код должен быть понятным. Здесь все в одну строку, не разобраться.
Если передам 2, 2, 3, вернёт 3, что не является минимальным значением.
Вызывается несуществующая функция - var_dump(getMax(5.1, 9.0, 4.4));
То есть ваш код попросту не работает. В следующий раз не буду даже разбирать. Отправляемые решение должно быть как минимум рабочим.
Где типы аргументов?!
Поиск минимального числа должен быть среди трёх чисел. Функция должна возвращать минимальное число а не строки!
Последняя функция тоже неправильно работает.
Ужасно. Перечитайте и урок и домашнее задание.
// Функция, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
function minValue(float $a, float $b, float $c)
{
if ($a > $b) {
//если выполняется, то проверяем оставшиеся два числа
if ($b > $c) {
return $c;
} else {
return $b;
}
} //если не выполняется, то сравниваем с оставшимся числом
elseif ($a > $c) {
return $c;
}
return $a;
}
echo 'Наименьшее число из трёх: ' . minValue(25, 3.4, 14);
---------------------------------------------------------------------------------------------------
// Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
function doubleMultiplication(int &$a,int &$b)
{
$a *= 2;
$b *= 2;
}
$a = 15;
$b = 7;
echo doubleMultiplication($a, $b) . 'Новые значения аргументов: a = ' . $a . ', b = ' . $b;
---------------------------------------------------------------------------------------------------
//Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)
function factorial(int $x)
{
//если значение равняется единице, то завершаем умножение и возвращаем единицу
if ($x == 1) {
return 1;
}
//умножаем текущее число на предыдущее
return $x * factorial($x - 1);
}
echo 'Факториал числа равен: ' . factorial(10);
---------------------------------------------------------------------------------------------------
//Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения.
function displayNumbers(int $x)
{
//если значение равняется нулю, то завершаем функцию
if ($x == 0) {
return 0;
}
//выводим текущее число и затем отнимаем от него единицу
echo $x . '<br>';
return displayNumbers($x - 1);
}
echo displayNumbers(10);
Теперь работает. Но во втором условии можно опустить часть про $b <= $a, так как в первом условии мы уже выяснили что $a не минимальное и сравнивать с ним второй раз смысла не имеет.
function getEvenNumbersUpTo($a){
$result = ''; // создание новой строки контейнера
for($x = 2; $x <= $a - 2; $x +=2){ // $a - 2 чтобы последнее число вывести правильно, а не больше на 1
$result .= $x.","; // ложим в контейнер значения;
}
return $result .= $x . "!"; //возвращаем $result;
}
echo "Выводим четные числа до ".'{$a}: '.getEvenNumbersUpTo(45);
Писал и выполнял на андроиде, поэтому получилось без пробелов. Попробовал добавить табуляции здесь и вставить в phpstorm (+ добавил решение последнего задания с рекурсией), но теперь браузер пишет error unexpected end of file, не проверяется. Извините, что отнял время...
Ой да первый раз прочитал мне показалось что четные только надо выводить.
А по поводу типа аргумента указывать его считается хорошим тоном или это правильное написание и так должно быть обязательно всегда?
Работать будет и без него, но писать нужно, позволяет избежать многих ошибок. Так вы всегда знаете, что за тип, и что с ним можно, а чего нельзя делать.
В PHP уже есть функция с таким именем. Назовите по-другому.
Куда пропали типы аргументов?
Фигурная скобка, открывающая тело функции, пишется на следующей строке.
Блоки if-else всегда оформляются с помощью фигурных скобок.
Что ещё за echo в функции, которая должна вернуть число? Она не должна ничего выводить!
Ну всё же абсолютно по-другому в уроке было, где вы этого нахватались? Привыкайте сразу писать правильно. Рекомендую исправить по всем пунктам.
Принято, спасибо!
Правильно ли я понял, что когда использую имя встроенной функции, ругается именно таким образом? Тип аргументов убрал, пока пытался разобраться, в чем именно проблема.
Набрался то там, то сям, я и условия задачи слегка исправил, чтобы не шаблонные решать, а хоть что-то свое.
Про фигурные скобки понятно, но я где-то вычитал, что если в блоке if else только одна одна стрОка, то фигурные скобки не обязательно, хотя наверное правильно сразу приучать себя их ставить..
echo в функциях вообще никогда не используется ? Я думал, что функцией можно сократить кусок кода, чтобы его не повторять каждый раз, или я что-то не так понял? Что ещё нельзя использовать внутри функций? Где прочитать ?
Про фигурные скобки понятно, но я где-то вычитал, что если в блоке if else только одна одна стрОка, то фигурные скобки не обязательно, хотя наверное правильно сразу приучать себя их ставить..
По правилам PSR всегда нужно ставить.
echo в функциях вообще никогда не используется?
Используется, когда нужно выводить. В задании же сказано, что функция должна возвращать что-то, про выводить ничего не было сказано, значит не нужно.
> Как думаете, можно ли в первой функции заменить elseif на if?
Можно, результат будет тот же, но код выглядит более понятным, верно? > Фигурная скобка, открывающая тело функции, переносится на следующую строку.
Спасибо, обязательно учту. > Лучше чтобы функция возвращала значения одного типа, либо null, когда что-то идет не так. Чуть позже мы рассмотрим механизм обработки таких ситуаций.
Хорошо
//Задание 1. Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
echo "<br>", 'Задание 1. Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.', "<br>";
//получаем случайное float с дробной частью часть от 0 до 0.9 с точностью 0.1
function getFloatRandom()
{
$minRand = 0;
$maxRand = 100;
return mt_rand($minRand, $maxRand) + (mt_rand(0, 9) / 10);
}
//заполняем значения
$x1 = getFloatRandom();
$x2 = getFloatRandom();
$x3 = getFloatRandom();
//функция нахождения минимального для двух чисел
function getMin(float $x1, float $x2)
{
if ($x1 < $x2) {
return $x1;
}
return $x2;
}
//функция нахождения минимального для трёх чисел
function getMin3(float $x1, float $x2, float $x3)
{
return getMin(getMin($x1, $x2), $x3);
}
//вызов функции и вывод результата
echo "<br>", "минимальное число из набора [$x1; $x2; $x3]: ", getMin3($x1, $x2, $x3), "<br>";
//-------------------------------------------------------------------------------------------------------------
//Задание 2. Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
echo "<br>", 'Задание 2. Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.', "<br>";
$a = getFloatRandom();//берём из предущей задачи. оптимизация, однако.
$b = getFloatRandom();
function doubleParams(float &$x1, float &$x2){
$x1 *= 2;
$x2 *= 2;
}
echo "было до преобразования: $a и $b", "<br>";
doubleParams($a, $b);
echo "стало после преобразования: $a и $b", "<br>";
//-------------------------------------------------------------------------------------------------------------
//Задание 3. Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)
echo "<br>", 'Задание 3. Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)', "<br>";
function getFactorial(int $x){
if ($x < 2){
echo $x;
return $x;
}
$f = $x * getFactorial($x - 1);
echo " * ", $x, ' = ', $f;
return $f;
}
$minRand = 0;
$maxRand = 10;
$x = mt_rand($minRand, $maxRand);
echo "факториал числа $x:", "<br>";
$f = getFactorial($x);
echo "<br>", "итог: $f";
//-------------------------------------------------------------------------------------------------------------
//Задание 4. Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения.
echo "<br>", 'Задание 4. Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения.', "<br>";
function showNumbersFromZeroToCurrent(int $x){
if ($x < 0){
return;
}
showNumbersFromZeroToCurrent($x - 1);
echo "$x ";
}
$x = mt_rand($minRand, $maxRand);
echo "последовательность числе от 0 до $x:", "<br>";
showNumbersFromZeroToCurrent($x);
Отлично, только отступы почему-то пляшут. elseif пишется на той же строке, что и }, после которого он идет. Хотя здесь можно elseif заменить на if, потому что если первое условие выполнится, то программа завершит свою работу тут же. А иначе... уже можно дальше просто if-ом проверять. Логика та же, по которой вы не стали оборачивать return $c; в блок else.
//Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
function mimimumFromThreeFloat(float $x,float $y,float $z)
{
return min($x,$y,$z);
}
$x=3;
$y=2;
$z=7;
echo 'Минимальным числом из '.$x.'; '.$y.'; '.$z. ' является число '.mimimumFromThreeFloat($x,$y,$z);
Результат:
Минимальным числом из 3; 2; 7 является число 2
//Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
function multiplicationTwo(&$x,&$y)
{
$x =$x * 2;
$y =$y * 2;
}
$a = 3;
$b = 5;
echo 'После умножения чисел '.$a.' и '.$b.' на 2'.'<br>';
multiplicationTwo($a,$b);
echo 'Получаем числа '.$a.' и '.$b.' соответственно.';
Результат:
После умножения чисел 3 и 5 на 2
Получаем числа 6 и 10 соответственно.
//Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =).
function factorialNumber($x)
{
switch($x) {
case 1:
case 2:
return $x;
break;
default:
return $x * factorialNumber($x - 1);
}
}
$a = 7;
echo 'Фактериал числа '.$a.' равен '.factorialNumber($a);
Результат:
Фактериал числа 7 равен 5040
//Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
function integersNumber($x)
{
switch($x) {
case 0:
echo $x;
break;
default:
integersNumber($x-1);
echo ', ' . $x;
}
}
$a = 7;
echo 'Целые числа от 0 до '. $a.'<br>';
integersNumber($a);
Результат:
Целые числа от 0 до 7
0, 1, 2, 3, 4, 5, 6, 7
//Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
function mimimumFromThreeFloat(float $x,float $y,float $z)
{
if ($x < $y) {
if ($x < $z) {
return $x;
} else return $z;
} elseif ($y < $z) {
return $y;
} else return $z;
}
$x=3;
$y=2;
$z=7;
echo 'Минимальным числом из '.$x.'; '.$y.'; '.$z. ' является число '.mimimumFromThreeFloat($x,$y,$z).'<br><br>';
//Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
function multiplicationTwo(float &$x,float &$y)
{
$x =$x * 2;
$y =$y * 2;
}
$a = 3;
$b = 5;
echo 'После умножения чисел '.$a.' и '.$b.' на 2'.'<br>';
multiplicationTwo($a,$b);
echo 'Получаем числа '.$a.' и '.$b.' соответственно.<br><br>';
//Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =).
function factorialNumber(int $x)
{
if ($x == 0){
return 1;
} else return $x * factorialNumber($x - 1);
}
$a = 7;
echo 'Факториал числа '.$a.' равен '.factorialNumber($a).'<br><br>';
//Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
function integersNumber(int $x)
{
if ($x == 0) {
echo $x;
} else integersNumber($x-1);echo ', ' . $x;
}
$a = 7;
echo 'Целые числа от 0 до '. $a.'<br>';
integersNumber($a);
Результат:
Минимальным числом из 3; 2; 7 является число 2
После умножения чисел 3 и 5 на 2
Получаем числа 6 и 10 соответственно.
Факториал числа 7 равен 5040
Целые числа от 0 до 7
0, 0, 1, 2, 3, 4, 5, 6, 7
Спасибо, с if код стал намного проще!
Первый ещё вот так можно сделать:
function mimimumFromThreeFloat(float $x,float $y,float $z)
{
if (($x < $y) && ($x < $z)) {
return $x;
} elseif ($y < $z) {
return $y;
} else return $z;
}
$x=3;
$y=2;
$z=7;
echo 'Минимальным числом из '.$x.'; '.$y.'; '.$z. ' является число '.mimimumFromThreeFloat($x,$y,$z).'<br><br>';
И четвёртый исправил на:
function integersNumber(int $x)
{
if ($x == 0) {
echo $x;
} else {integersNumber($x-1);echo ', ' . $x;}
}
$a = 7;
echo 'Целые числа от 0 до '. $a.'<br>';
integersNumber($a);
теперь результат:
Целые числа от 0 до 7
0, 1, 2, 3, 4, 5, 6, 7
p.s. 4ую задачу пришлось подглядеть, не до конца сам допер((
Первую задачу можно решить с помощью функции min()
И объясните пожалуйста как записываются и хранятся значения $x в 3ей и 4ой задачи. Я понимаю что это работает как "счётчик", но почему когда вызываешь функцию внутри функции, то $x берётся как $x -1(всегда уменьшенный на 1), а не один вычитается из полученного за прошлый раз значения, например
в факториале после 1 прохода получается 12, то почему далее берется не 12-1, а 3-1.
На вашем примере со степенью всё понятно, там $n не трогают, а вот как это работает с одной переменой, не понятно. Надеюсь поняли о чём я.
А так мне материал понятен.
На прошлом шаге мы уже поняли, что x не минимальное. С ним сравнивать уже не имеет смысла.
Факториал нуля - единица
В каждом вызове функции эта переменная своя. Текущий вызов функции ничего не знает о той переменной в функции, из которой она была вызвана. Смотрите видео из следующего урока. Должно стать понятнее.
Скобка после условия пишется на той же строке. И нужно соблюдать отступы. Если пользуетесь PHPStorm, там можно просто нажать сочетание клавиш CTRL+ALT+L
Понял, редактировал)
p.s. Артём, может поправить эту строку: "А сейчас убираем строку _declare(stricttypes=1); из нашего кода и идём дальше." Убрать нижнее подчёркивание перед declare и поставить между strict и types, чтобы как надо было)
<?php
echo 'Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.<br>';
function getMin(float $x, float $y, float $z)
{
if (($x < $y) && ($x < $z)) {
return $x;
} elseif ($y < $z) {
return $y;
}
return $z;
}
echo 'a = '.$a = 4;
echo '<br>b = '.$b = 3;
echo '<br>c = '.$c = 1;
echo '<br>Минимальное значение: ' . getMin($a, $b, $c);
echo '<br><br>Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.<br>';
function multiply2(&$x, &$y)
{
$x = $x * 2;
$y = $y * 2;
}
echo 'a = '.$a = 3;
echo '<br>b = '.$b = 4;
multiply2($a, $y);
echo '<br>2a = ' . $a;
echo '<br>2b = ' . $b;
echo '<br><br>Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). <br>';
function factorial(int $x)
{
if ($x == 0) {
return 1;
}
return $x * factorial($x - 1);
}
echo 'x = '.$x = 5;
echo $x < 0 ? '<br>Задано отрицательное число' : '<br>x! = ' . factorial($x);
echo '<br><br>Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.<br>';
function row (int $x)
{
if ($x == 0) {
return $x;
} elseif ($x > 0) {
return row($x - 1) . ', ' . $x;
} else {
return row($x + 1) . ', ' . $x;
}
}
echo 'x = '.$x = -10;
echo '<br>Ряд: ' . row($x);
Результат:
Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
a = 4
b = 3
c = 1
Минимальное значение: 1
Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
a = 3
b = 4
2a = 6
2b = 4
Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного).
x = 5
x! = 120
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
x = -10
Ряд: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
echo '<br><br>Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.<br>';
function multiply2(int &$x, int &$y)
{
$x = $x * 2;
$y = $y * 2;
}
echo 'a = '.$a = 3;
echo '<br>b = '.$b = 4;
multiply2($a, $b);
echo '<br>2a = ' . $a;
echo '<br>2b = ' . $b;
У меня вопрос.
Почему рекурсия, а не цикл? Просто для того, чтобы в этой теме рекурсию изучить? Или это потребует меньше ресурсов при вычислении?
Просто, например, как в третьей задаче:
Это просто примеры рекурсии. Но есть некоторые алгоритмы, которые реализуются с помощью рекурсии более элегантно, а есть, которые реализуются только с помощью рекурсии. О них позже.
function multiplyByTwo(int &$x, int &$y)
{
$x *= 2;
$y *= 2;
}
3.
function factorial(int $x)
{
if ($x == 0) {
return 1;
}
return $x * factorial($x - 1);
}
Согласен, скопипастил невнимательно, не адаптировал под свое.
Но, на второй итерации копипасты в процессе дебага кажется начало приходить легкое подобие понимания рекурсии...
function printInts(int $num)
{
if ($num == 0) {
echo $num;
return;
}
printInts($num - 1);
echo $num.'<br>';
}
1 задание
function getMin($a, $b) {
return $a < $b ? $a : $b;
}
function getMinOfThree(float $a, float $b, float $c) {
return getMin($a, getMin($b, $c));
}
2 задание
function doubleValues(&$a, &$b) {
$a *= 2;
$b *= 2;
}
3 задание
function getFactorial($x) {
if ($x == 1) return $x;
return $x * getFactorial($x - 1);
}
4 задание (блин, без цикла не понимаю, как)
function showValuesTillX($x) {
for ($i = 0; $i <= $x; $i++) {
echo '<br/>'.$i;
}
}
А еще вопрос - в цикле не лучше решать задачи типа возведения в степень, например, пример из статьи сделать так?
function onDegree($a, $b) {
$c = $a;
while ($b > 1) {
$b -= 1;
$a *= $c;
}
return $a;
}
Более или менее это ресурсозатратно или все равно?) Спасибо)
Имена функций пишутся с маленькой буквы. Где типы аргументов? Факториал нуля - единица. Функции не должны ничего выводить, они должны возвращать. getMinFromThree не читаемая от слова совсем, тернарный оператор тут не к месту. Нужно всё переделать.
function power(int $x, int $n)
{
var_dump($x, $n);
if ($n == 1) {
return $x;
}
return $x * power($x, $n - 1);
}
echo 'Результат: ' . power(2, 3);
Сломал себе всю голову. Позвольте я расскажу, как я "читаю" эту функцию, а вы, если найдете время, наставьте, пожалуйста.
Фунцкция вызывается и проверяется первое условие. 3 не равно единице, поэтому происходит следующей шаг, в котором
$n уменьшается на единицу и за счет обращения функции к самой себе - она начинается сначала.
Снова проверяется первое условие: 2 не равно единице. После чего опять $n уменьшается на единицу и все возвращается к началу.
Теперь $n == 1, значит функция может завершиться и вернуть $x. К следующему шагу мы не переходим.
Вот...
Судя по вардампу переменная х во всех циклах не менялась и оставалась двойкой.
int(2) int(3) int(2) int(2) int(2) int(1)
Мне, хоть убей, не понятно - за счет чего получается 8.
Сори, если глупость пишу, самому стыдно.
Но я что-то вообще никак.
Спасибо за комментарии, свои ошибки поняла.
Проверила еще раз функцию minFloat, дело в том, что было задано два одинаковых числа, а я не прописала это в условии. На будущее запомню и буду обращать внимание на это)
echo 'Факториал числа ' . $a .' = '. getFact($a);
P.S.Последнее задание не стал делать,чтобы не обманывать себя и тебя.Третье подглядел но вроде понял.
<?php
//Задание №1.
function getMini (float$x, float$y, float$z)://Функция принимает на входе 3 аргумента типа float.
{
if ($x < $y && $x < $z) {://Если число $x меньше, то возвращаем это число.
return $x;
}
if ($y < $x && $y < $z) {://Если число $y меньше, так же возвращаем это число.
return $y;
}
return $z;
}
$a = 5.5;
$b = 2.34;
$c = 3.45;
echo 'Наименьшее число:' . getMini($a,$b,$c); // Наименьшее число:2.34
echo '<br><br>';
//Задание №2.
function getMultiply ( &$a, &$b){ ://Функция принимает на входе два аргументаи по ссылке
и умножает каждый из них 2.
$a *= 2;
$b *= 2;
}
$x1 = 4;
$x2 = 10;
echo 'Первое число:' . ($x1) * 2 . '<br><br>';// Первое число 8.
echo 'Второе число:' . ($x2) * 2 . '<br><br>';// Второе число 20.
echo '<br>';
//Задание №3.
function factorial(int $x1, int $x4) :// Функция ,считающая факториал произведения целых чисел от
{ единицы до переданного.
var_dump ($x1,$x4);
echo '<br><br>';
if ($x4 == 1) { // Если степень равна 1, то возвращаем само это число.
return $x1;
}
return $x1 * factorial ($x1, $x4 -1);//Умножаем число на возведенную в степень $x4 -1 и
} возвращаем его.
echo factorial (2, 3);// int(2) int(3) int(2) int(2) int(2) int(1) =8
В последнем задании была проблема с ВЫВОДОМ. Так и не решил, подсмотрел в комментариях.
Но уже после осталось непонятным как работает оператор return; без какого-либо значения. Можете объяснить?
День добрый! Я знаю, что последняя задача решена неверно (порядок цифр не тот), так еще и коряво. Просто хотела показать, что сама смогла додумать. Следующий урок пока не смотрела.
Я посмотрела Ваш пример правильного решения задачи, и от этого еще больше путаницы возникло: я думала, что return должен возвращать что-то конкретное, тогда как в примере после него ничего нет. Какую роль тогда он выполняет в данном случае?
Завершает работу функции. Это то, что он делает вместе с возвратом значения. Если справа от него не указано значение, возвращается null, то есть "ничего".
В данном случае прописала именно так для правила факториала, если значение = 0.
Скобки там по невнимательности)
Вроде начала понимать, как это работает: После выполнения условия, когда $x == 0, функция дает команду на выведение значения, завершается цикл, и тогда начинают выводиться, раннее выполненные действия.
Если убрать аргумент 'i', то выводить будет в обратном порядке. Не 0, 1, 2, 3 ... а ..., 3, 2, 1, 0. Можно сделать так, но таких решений выше много, а хотелось что-то уникальное.
При получении аргументов по ссылкам также нужно приводить тип аргументов? Например если в источнике ссылки переменные типа float, а мы приводим их к int? Или я не так Вас понял?
Что с форматированием? Пишите как в уроках.
Прошу прощения. Писал код в sublime text. В следующих заданиях буду учитывать замечание.
Артем, не подскажете, почему PHP не ругается если в функцию где в аргументах указан тип float передать int? Если сделать наоборот то сразу выскакивает ошибка.
Работает автоматическое приведение типов. Если хотите чтобы типы были всегда такими, как написано, можно использовать директиву strict_types (погугли самостоятельно)
Директиву strict_types использовал, нашел вот такой ответ "Единственное место, где режим строгой типизации позволяет автоматические преобразования — из int в float."
Сейчас еще раз перечитал вопрос и понял, что в первый раз ответил не совсем про то. int можно безболезненно преобразовать во float, просто добавится .0
Если же float приводить к int, то придется отбросить часть после запятой, что некорректно. Ну а вообще не стоит никогда полагаться на автоприведение, всегда делайте это явно.
<?php
/*Функция, которая принимает на вход два аргумента по ссылкам
и умножает каждый из них на 2. */
function multiOn2(&$x, &$y)
{
$x = $x*2;
$y = $y*2;
}
$a = 3;
$b = 5;
multiOn2($a, $b);
echo $a;
echo '<br>';
echo $b;
<?php
/*Функция, считающая факториал числа
(произведение целых чисел от единицы до переданного)*/
function getMultiOfNumbersFromZero(int $n)
{
// Если сейчас 1, то просто возвращаем 1
if ($n == 1) {
return 1;
}
// В остальных случаях - умножаем текущее число на произведение всех предыдущих
return $n * getMultiOfNumbersFromZero($n - 1);
}
echo 'Результат: ' . getMultiOfNumbersFromZero(7);
<?php
/* Функция которая будет принимать на вход 3 аргумента
с типом float и возвращать минимальное значение.*/
function getMin(float $v, float $q, float $p) {
if ($v < $q || $v < $p) {
return $v;
}elseif ($q < $p) {
return $q;
}else{
return $p;
}
}
$v = 9; $q = 9.9; $p = 999;
echo 'минимальное значение: ' . getMin($v, $q, $p);
<?php
/* Функцию, которая принимает на вход два аргумента по ссылкам
и умножает каждый из них на 2.*/
function multiplication3(&$x, &$y) {
$x = $x * 2;
$y = $y * 2;
}
$a = 4;
$b = 6;
multiplication3($a, $b);
echo $a . '<br>';
echo $b;
<?php
//функция считающуя факториал числа
function factik($n)
{
if ($n <= 0) return 1;
return $n + factik($n - 1);
}
echo factik(9);
Первое и второе задание не составило большого труда сделать, но вот на 3ем задание пришлось обращаться в справочник PHP. 4 задание слишком пока сложновато для понимания, оставлю на потом...
Надеюсь в будущем это уже всё укомплектуется в голове и не будет таких тугодуманий над рекурсией)))
Хорошо, я учту всё выше сказанное.
Благодарю вас за обратную связь, работа над ошибками это составляющая часть обучения. В дальнейшем надеюсь такие ошибки не совершать!)
Подправил, проверил на валидность, в итоге всё нормально.
<?php
/* Функция которая будет принимать на вход 3 аргумента
с типом float и возвращать минимальное значение.*/
function getMin(float $v, float $q, float $p)
{
if ($v < $q && $v < $p) {
return $v;
} elseif ($q < $p) {
return $q;
} else {
return $p;
}
}
$a = 12;
$b = 9.9;
$c = 9;
echo 'минимальное значение: ' . getMin($a, $b, $c);
Скобку тут перенёс.
<?php
/* Функцию, которая принимает на вход два аргумента по ссылкам
и умножает каждый из них на 2.*/
function multiplication3(&$x, &$y)
{
$x = $x * 2;
$y = $y * 2;
}
$a = 4;
$b = 6;
multiplication3($a, $b);
echo $a . '<br>';
echo $b;
Подправил, посмотрел ход действий через Xdebug. Всё работает получилось 45, вместо 46.
<?php
//функция считающая факториал числа
function factik($n)
{
if ($n == 1 || $n == 0) return 1;
return $n + factik($n - 1);
}
echo factik(9);
Привет, немного не поняла. Поправь, если не права. Задание было найта факториал от 1 до заданного числа. Моя программа при переменной, равной 1, заканчивает работу. Причём здесь 0 и бесконечная рекурсия?
Проверяла на http://sandbox.onlinephpfunctions.com/ Выдает то, что задано.
Идею рекурсии я поняла. Пока сложно думать на языке программирования. Поэтому задания делала скорее интуитивно, чем осмысленно.
1.Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
3 . Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного).
<?php
function factorial(int $n)
{
if ($n == 1) {
return $n;
}
return $n * factorial($n - 1);
}
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. (Не совсем поняла чем же тут сложность выше, чем в предыдущем? Типа там можно было из примера в уроке содрать и плюс на умножить поменять, а тут надо было извилиной шевельнуть? =))) )
<?php
function fromZeroToX(int $x, int $n)
{
echo $n . "\n";
if ($n == $x) {
return;
}
return fromZeroToX($x, $n + 1);
}
fromZeroToX(13, 0);
Я и в первый раз вставляла оформленный в шторме код и в шторме он выглядел ничего так...
Каюсь, чтобы не делать отдельных файлов просто запхнула все в хтмл, поэтому и использовала закрывающий тег.
--- Может стоит к оформлению кода добавить до и после кавычек отступы? А то я пока поняла, что стоит код отделить от текста дополнительными переводами строк, такого наформатировала... Это из-за неправильно расставленных абзацев код отображался неправильно.
(Т_Т Рекурсия по сравнению с оформлением и настройками всех компонентов для организации обучения - просто детский лепет. Чувствую себя, словно осталась всего одна извилина, и та прямая.)
Не могла понять, почему в первом задании можно опустить else. А тут пришла мысль: Если первое условие выполнится, то после return функция просто завершится. В противном случае продолжится чтение условия. Получается, что если бы не было return опустить else было бы нельзя?
Ну пусть будут float. В задании же не указано, что они должны быть целыми =)
В любом случае, спасибо вам, за ваше такое полезное хобби ))
Оформляйте код (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте, пожалуйста. А потом ответьте мне на этот комментарий. Проверю домашку после этого.
Оформляйте код (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте, пожалуйста. А потом ответьте мне на этот комментарий. Проверю домашку после этого.
Четвертое задание действительно показалось сложным, воспользовался подсказкой, а потом сделал вывод в обратном порядке. В общем получилось два варианта. Так делают?
Я не понимаю как работает код:
в строчке: return $x * power($x, $n - 1);
как функция понимает что $n-1 это степень, что $x надо умножать на себя n-1 раз, этого нигде не прописано, т.е. выглядит так буд-то функция обращается сама к себе, но все что в ней есть это: if ($n == 1) {
return $x; и к чему тут обращаться?
echo 'результат: '.MinX(3, 6, 7).'<br>';
function Ahref(&$a, &$b){
$a = $a2;
$b = $b2;
echo $a.' , '.$b;
}
$h = 4;
$l = 5;
Ahref($h,$l);
function getSumOfNumbersFromZero(int $n)
{
// Если сейчас 1, то просто возвращаем 1
if ($n == 1) {
return 1;
}
// В остальных случаях - прибавляем текущее число к сумме всех предыдущих
return $n * getSumOfNumbersFromZero($n - 1);
}
echo '<br>'.'Результат: ' . getSumOfNumbersFromZero(6).'<br>';
function numbers(int $n)
{
// Если сейчас 0, то просто возвращаем 0
if ($n == 0) {
echo 0;
return 0;
}else
{
// В остальных случаях - прибавляем текущее число к сумме всех предыдущих
echo $n. '<br>';
return numbers($n - 1);
}
Оформляйте код (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте, пожалуйста. А потом ответьте мне на этот комментарий. Проверю домашку после этого.
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу.
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
В первом задании выполнил сравнение переменных, может код и не сильно красивый, но он работает))
К сожалению или к счастью решить 4 задание смог только таким методом, через 2 функции.
Посмотрел работы однокурсников, да, что то я не совсем понял как работает функция по моему.
был близок но не дошел до решения, не совсем понял что делает return, ниже пример кода
Почему в примере возведения в степень, рекурсия заканчиванется при n==1 с возвратом основания, а не при n==0 с возвратом единички?
<?php
function power(int $x, int $n)
{
// Если сейчас степень равна единице, то возвращаем само это число
if ($n == 1) {
return $x;
}
// В остальных случаях - умножаем число на возведённое в степень n - 1 и возвращаем его
return $x * power($x, $n - 1);
}
echo power(2, 3);
//РЕКУРСИЯ от 0 до N
<?php
function getPrint(int $n)
{
// Если сейчас -1, то просто возвращаем 0
if ($n == -1)
{
return 0;
}
// В остальных случаях - от заданого числа минусуем его же, но на 1 единицу меньше)
echo $n- getPrint($n - 1). '</br>' ;
}
getPrint(32) ;
<?php
function getFactorial(int $n)
{
// Если сейчас 1, то просто возвращаем 1
if ($n == 1)
{
return 1;
}
// В остальных случаях - умножаем текущее число к проиведению всех предыдущих
return $n * getFactorial($n - 1);
}
echo 'Результат: ' . getFactorial(9);
<?php
function getSumOfNumbersFromZero(int $n)
{
// Если сейчас 1, то просто возвращаем 1
if ($n == 1)
{
return 1;
}
// В остальных случаях - прибавляем текущее число к сумме всех предыдущих
return $n + getSumOfNumbersFromZero($n - 1);
}
echo 'Результат: ' . getSumOfNumbersFromZero(5);
<?php
//1. Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
function getMinNumberOfthree(float $x, float $y, float $z)
{
if ($x < $y) {
if ($x < $z) {
return $x;
}
return $z;
} elseif ($y < $z) {
return $y;
}
return $z;
}
echo getMinNumberOfthree(0.12, 3.54, 1.01);
echo '<hr>';
//2. Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
function getMultiplicationTwoNumbersByTwo(int &$x, int &$y)
{
$x *= 2;
$y *= 2;
}
$a = 4;
$b = 6;
getMultiplicationTwoNumbersByTwo($a, $b);
echo $a;
echo '<br>';
echo $b;
echo '<hr>';
//3. Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Реализуйте с помощью рекурсии.
function getFactorial(int $x)
{
if ($x === 0) {
return 1;
}
return $x * getFactorial($x - 1);
}
echo getFactorial(0);
echo '<hr>';
/*4. Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже нужно
реализовать с помощью рекурсии (чтобы лучше с ней познакомиться, несмотря на то что вариант с циклом проще).*/
function getRowOfNumbers(int $x)
{
if ($x === 0) {
return $x;
}
return getRowOfNumbers($x - 1) . ", $x";
}
echo getRowOfNumbers(5);
echo '<hr>';
По первому упражнению увидел что два условия можно проверять вместе когда уже своё сделал, но не стал менять чтобы просто не копировать. Можно вопрос: Это обязательно делать строгое сравнение в функции если мы и так определям какой тип аргумента будет передаваться? Вначале я сделал просто сравнение (==).
<?php
/* Напишите функцию, которая будет принимать на вход 3
аргумента с типом float и возвращать минимальное значение.*/
function minFloat(float $x, float $y, float $z)
{
if ($x > $y && $x > $z) {
return $x;
} else if ($y > $x && $y > $z) {
return $y;
}
return $z;
}
$a = 3.1;
$b = 5.5;
$c = 9.2;
echo minFloat($a, $b, $c);
echo '<br><br>';
/* Напишите функцию, которая принимает на вход два
аргумента по ссылкам и умножает каждый из них на 2.*/
function numbersMult2(int &$a , int &$b)
{
$a *= 2;
$b *= 2;
}
$a = 3;
$b = 53;
numbersMult2($a, $b);
echo $a . ' and ' . $b;
echo '<br><br>';
/* Напишите функцию, считающую факториал числа (произведение
целых чисел от единицы до переданного). Реализуйте с помощью
рекурсии. */
function factorial(int $a) {
if ($a == 1) {
return 1;
}
return $a * factorial($a - 1);
}
$a = 4;
echo factorial($a);
echo '<br><br>';
/* Напишите функцию, которая будет выводить на экран целые числа
от 0 до переданного значения. И да, тут тоже нужно реализовать с
помощью рекурсии (чтобы лучше с ней познакомиться, несмотря на
то что вариант с циклом проще).*/
function orderNumber(int $a, int $i) {
if ($i == $a) {
echo $i;
return 0;
}
echo $i . ' ';
return orderNumber($a, $i + 1);
}
$a = 3;
$i = 0;
orderNumber($a, $i);
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу и отвечу на вопросы.
Совершенно нечитаемый код. Нужно исправить оступы и переносы строк, чтобы было как в уроках. Скобка, открывающая тело функции, пишется на новой строке.
Если передать 3, 3, 3 то вернётся 0, что неверно.
Тут я её самостоятельно и реализовал. Первые три задания делал не глядя в комменты, только 4 " вызвало трудности - пришлось подсмотреть, понимание появилось."
<?php
//Напишите функцию, которая будет принимать на вход 3 аргумента с типом
//float и возвращать минимальное значение.
function getMin(float $x, float $y, float $z)
{
if ($x < $y && $x < $z) {
return $x . '</br>';
} elseif ($y < $x && $y < $z) {
return $y . '</br>';
}
return $z . '</br>';
}
$a = 2;
$b = 2;
$c = 1;
echo 'Минимальное значение:' . getMin($a, $b, $c);
//Напишите функцию, которая принимает на вход два аргумента по ссылкам и
//умножает каждый из них на 2.
function argX2(int &$x1, int &$y1)
{
$x1 = 2 * $x1;
$y1 = 2 * $y1;
return $x1 . " " . $y1;
}
$a1 = 4;
$b1 = 2;
echo 'Ответ:' . argX2( $a1, $b1) . '</br>';
//Напишите функцию, считающую факториал числа (произведение целых
//чисел от единицы до переданного). Реализуйте с помощью рекурсии.
function factor(int $x3)
{
if ($x3 <= 0) {
return 1;
}
return $x3 * factor($x3 - 1);
}
$a2 = 5;
echo 'факториал равен:' . factor($a2) . '</br>';
//Напишите функцию, которая будет выводить на экран целые числа от 0 до
//переданного значения. И да, тут тоже нужно реализовать с помощью
//рекурсии (чтобы лучше с ней познакомиться, несмотря на то что вариант с
//циклом проще).
function intOUT(int $x4)
{
if ($x4 > 0) {
echo intOUT($x4 - 1);
}
return $x4;
}
$a3 = 8;
echo intOUT($a3) . '</br>';
?>
Типы добавил, оформление исправил, но что-то я не понял, почему вы сказали, что getMin(2, 2, 1) возвращает 2, у меня возвращает 1, если я вас правильно понял
Артем, подскажи, пожалуйста, а как написать функцию, чтобы получить первые несколько слов из предложения?
Я использую такую конструкцию, чтобы получить первое слово:
Скобка, открывающая тело функции, пишется на новой строке. Да и в целом с форматированием беда какая-то. Нужно сделать как в уроках с соблюдением отступов и переносов.
Ничего сложного в факториале нет. Просто загуглите что это такое.
Добрый вечер Артём, подскажи пожалуйста, как написать (решить правильно) рекурсивную функцию для палиндрома (если делать через функцию strrev - понятно, но, если делать рек
Спасибо за урок. Решения еще не смотрел, реализовал задания так:
<?php
// Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
function getMinFloatValue(float $num1, float $num2, float $num3)
{
return min($num1, $num2, $num3);
}
echo 'Минимальное значение: ' . getMinFloatValue(8, 10, 7) . '<hr>';
// Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
function getMultiplyBy2(int &$num1, int &$num2): void
{
$num1 *= 2;
$num2 *= 2;
}
$testNum1 = 5;
$testNum2 = 7;
getMultiplyBy2($testNum1, $testNum2); // умножение прошло
echo "Первое число: $testNum1<br>" . "Второе число: $testNum2<hr>";
/* Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного).
Реализуйте с помощью рекурсии.*/
function getFactorialNumbers(int $number): int
{
if ($number <= 1) {
return 1;
}
return $number * getFactorialNumbers($number - 1);
}
echo 'Факториал числа:' . getFactorialNumbers(3) . '<hr>';
/*Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения.
И да, тут тоже нужно реализовать с помощью рекурсии.*/
function recursiveNumbersOutput(int $number): void
{
if ($number >= 0) {
recursiveNumbersOutput($number - 1);
echo $number . ' ';
}
}
recursiveNumbersOutput(10);
С рекурсией сложновато, сам не осилил, помогал гугл)
В 3 задаче про факториал. (произведение целых чисел от ЕДИНИЦЫ до переданного)
Глаз-алмаз :)
Спасибо, исправил.
Решение последней задачи:
Принято! Отличный вариант. Однако можно чуть упростить - как я говорил, функция может и вовсе ничего не возвращать. В итоге всё можно свести к следующему коду:
По поводу бонуса написал на почту. Так держать!
А если переданное значение будет отрицательное. Например -10, тогда данная функция не сработает)
Я понять не могу,почему у нас отсчет идёт при выводе с 0,мы же уменьшаем переменную $x,а не увеличиваем. Значит по идее должно быть 5,4,3,2,1,0
Смотри следующий урок про отладку
Посмотрел,включил XDebug . Первое действие numbers(x-1);и почему там ответ $x:1 . По идее же должно быть 4, т.к $x=5 ($x-1)=(5-1)
У меня на первом уровне погружения 5, потом 4, потом 3... Дохожу до нуля. Условие выполняется, вывожу 0. Поднимаюсь на уровень выше, следов для $x = 1 выполняется:
Тут функция завершает свою работу. Возвращаюсь еще на уровень выше. там $x = 2.
Вывожу 2. И в итоге дохожу до 5. Вывожу его. Функция завершается. Возвращаюсь к месту, где она изначально была вызвана с параметром 5. Дальше кода нет. Работа скрипта завершается.
solved
я сделал так. Учитывая что значение может быть также и отрицательное.
отличный вариант!
Ребята, вы молодцы. Огромное Вам спасибо. Подскажите когда будет продолжение курса?
Привет, спасибо!
На выходных появится новый урок, будет интересная тема =)
Спасибо, жду с нетерпением! =)
Не могу понять, а как программа в последней задаче пробегает от 0 до нужного значения.
А на листочке уже пробовали пошагово разобрать?
Вот представьте:
Дойдите так до 0, и напишите, стало ли понятно.
Извините но не понимаю. Если я устанавливаю первоначальное значение числа например 5 то почему стартует с 0?
Потому что именно при нуле сработает первый echo. Затем мы выполним return и вернемся на уровень выше, где в функцию была передана единица. После вызова функции с передачей в неё нуля идет строка, которая выведет единицу. И так далее. Если сейчас нет понимания - ничего страшного. Тема рекурсии не сразу дается. Дождитесь следующего урока, там точно станет понятнее, обещаю =)
Я вот, что-то не понимаю. Почему в функцию передается 1, потом 2 и т.д.?
Нет, в функцию передаётся как раз в обратном порядке: 5, 4, 3...
Посмотрите следующий урок про отладку приложений, должно стать понятнее. Там тоже будет рекурсия.
ТОже вопрос возник такой. Глаз замылился, потупил посидел. Спасибо, разъяснили!
Всё верно =)
Какой код корректней использовать для решения этой задачи? Вышеуказанный или
Я бы выбрал Ваш вариант, но тот тоже вполне имеет право на существование. elseif пишется слитно.
Catchable fatal error: Argument 1 passed to getMin() must be an instance of float, integer given, called
используйте PHP7
Не могу понять как работает это выражение :( $x * power($x, $n - 1), т.е я понимаю, что под этим скрывается 2 * power(2, 2), но как происходит умножения двойки на функцию с двумя аргументами? Как двойка выбирает на какой аргумент умножать? Действительно мозги закипают!)
Посмотрите следующий урок, должно стать понятнее :)
Благодарю! Кстати отличный курс, прошёл на одном дыхании. THUMBS UP
Спасибо! Но это только треть, от того что я запланировал :)
Бамба!
1)
А зачем вы сделали приведение к float при определении переменных? И нужно добавить приведение к типу в аргументах функции. А в целом - алгоритм верный.
Я не понял алгоритм, можете сказать как он работает?
2)
Всё хорошо, только добавьте типы для аргументов функции =)
Верно!
ПО поводу последней задачи так и не разобрался. Вижу решение, но как это все работает вместе - хз. Будем думать.
А я первую функцию с одной & писал - это неверно?
Конечно, неверно. Это совершенно другой оператор.
По поводу последнего задания. Почему уменьшаем на единицу, а выводится с увеличением?
А вы запустите код в отладчике, и всё поймёте =) Вы же смотрели урок про отладку с помощью XDebug?
P.S. код после блока if {...} не надо заключать в фигурные скобки. Это бессмысленно. Просто продолжайте писать функцию дальше без скобок.
Первое задание

Предпочтительнее - оформлять код с помощью markdown-разметки, вот так:
```
код
```
Как и у большинства начинающих - проблема с отступами и оформлением. Почитайте про Reformat Code в PhpStorm. Закрывающий тег в конце не нужен.
Задание сделано неверно, перечитайте внимательно.
Второе задание

Конкатенация строк происходит с помощью точки:
Да, точно, забыл, не привык еще) Спасибо!)
Третье задание

Тут всё хорошо.
Подскажи куда правильно вставить var_dump или что нужно сделать, чтоб увидеть как получилось 120 в данном коде:
с помощью xDebug пробовал, но не увидел как получается 120
Перед return-ами.
Четвертое задание

Тут тоже всё верно)
Вариант для последнего задания. Выводит числа от m до n.
Конкатенация строк происходит с помощью точки:
Имена функций начинаются с маленькой буквы.
Верно! =)
Ошибка. Если я передам числа 2, 3, 1, то вернется число 2.
1 Задача
Всегда оформляйте код после if и else в блоки с помощью фигурных скобок.
2 Задача
Тут всё гуд)
3 Задача
У функции открывающая фигурная скобка находится на следующей строке. В остальном - норм.
2 раза пересматривал видео урок чтобы понять=)
В комментарии не смотрел, крутые курсы все достаточно понятно, было бы круто если бы задач было побольше.
4 Задача
Спасибо, учту) По поводу двух раз - это до вас ещё быстро дошло.
Что касается задачи - привыкайте использовать типы для аргументов функций.
Будет плюсом при трудоустройстве, если вы будете знать возможности PHP7.
Думал что язык сам подбирает тип переменных поэтому не считал нужным писать их в аргумент функции)
Он их не подбирает. Если их не указать, то они придут как есть. Это плохо, когда в аргументах может прийти что угодно. Это приводит к большему числу ошибок.
Добрый день. Подскажите, пожалуйста, при рекурсии получается, что функция преобразует запись 2^3 в 2x2^2, а потом в 2x2x2^1?
Добрый. Да, вроде того. Посмотрите видео в следующем уроке, после него точно поймёте.
Задание №4.
Не могу понять, как сделать, чтобы отсчет начинался с 0, а не с заданного числа
Подсмотрите в других комментариях, не страшно :)
По поводу последней задачи - не уверен, но мне кажется самый лаконичный вариант:
Отлично! Но return в конце не имеет смысла. Уберите, пока никто не увидел =)
Отлично! Из замечаний:
C последней функцией повышенной сложности не справилась (( Рассмотрела, как решили другие, все вроде бы понятно, но вот сама не дошла до этого, увы.
Фун №1
Фун №2
Фун №3
Отлично!
Добрый день.
Добрый день, это про то, что нельзя при вызове функции передавать ссылку:
Но при определении функции это можно делать:
Благодарю за урок!
Изменится ли что-то, если убрать вот этот кусок:
ничего не изменится)
Правильно, значит этот кусок кода убираем, и код становится проще :)
Не забывайте указывать типы у аргументов функций!
Да, спасибо, я их специально не указываю т.к.:
А у меня в проекте 5.4.
Но я это учитываю.
Советую Вам всё же перейти на версию 7, 5.4 - старенькая. На работе будут требовать 7, и будет круто, если Вы уже её использовали.
Да, я конечно же перейду, у меня просто есть проект в котором сейчас 5.4 и пока удобнее оставаться на ней. Но преимущества 7-ки я оценил.
Это к какому заданию домашка?
Первое:
Второе:
Третье
Все ли верно или что то лучше написать иначе?
4 глянул в комментах, не очень понятно почему выводит на экран с нуля а не наоборот =)
Всё норм, но непонятно зачем во втором вы возвращаете строку из двух склеенных чисел. По поводу четвертого - переходите к следующему уроку, будет понятнее.
Подправил чуток второе. Да с отладкой, четвертое стало понятнее, но еще надо с рекурсией разбираться
Окей, ничего страшного, рекурсия многим непонятна на первых порах.
1:
2:
3:
4.0:
Здесь обошелся без рекурсии и более понятно.
4.1:
Здесь не поянтно почему cперва 0, а не 1 ведь arg-(arg-1)=1?
Нужно указывать return-type для функции, через двоеточие, как в уроке.
3 - а где обработка случая, когда не больше единицы? Вам повезло, что null преобразовался в 0. Факториал - это произведение а не сумма.
4 - в именах функций в современном PHP не используются подчеркухи. Потому что выражение сначала вычисляется, а затем выводится. Самым первым будет вычислено выражение для нуля, оно же и выведется первым.
Благодарю за замечания!
3. Так будет корректно? Или не очень?
Привет, не очень, потому что:
3 задание
Отлично =)
Верно ли выполнение третьего задания?
ну не работает же, ёлки-палки - функция называется Factorial (что некорректно - все имена функций должны начинаться с маленькой буквы), а вызывается и в теле, и снаружи getFactorial.
после блока с return необязательно ставить elseif - если верхнее условие выполнится, то функция не пойдет дальше, поэтому лучше просто if c новой строки:
Спасибо за урок!
Хорошо!
В рекурсии не разобрался (отчасти понял), но комменты почитал и попробовал код других ребят копировать и разобрать. Буду дальше учить... разберусь)
Отличная домашка! Но можно еще добавить return-значения для функций (после двоеточия).
Спасибо, это со временем наверное придет)
Да, конечно)
Задача 1: нахождение минимального числа.
Норм)
Вообще без "return" сделал. Возможно, в моем случае как-то по-другому вывод происходит, нежели в вашем примере, но все работает.
echo - выводит, return - возвращает. То есть потом значение, которое функция вернула, можно использовать. Например, вот так:
Исходные числа a = 3.1 b = 15.3 c = 11.1
Максимальное из трех чисел 15.3
Исходные числа x = 5 y = 10
Числа умноженные на 2:
10 20
Число x=4, его факториал = 24
Список значений числа
0, 1, 2, 3, 4, 5, 6, 7
По логике - всё отлично.
Последняя задача без рекурсии
Для чего здесь переменная str? Зачем в конце что-то возвращать и выводить результат функции, если она внутри своего тела выводит нужные данные.
Почему не указали типы аргументов? Где тип возвращаемого значения?
И почему не сделали как написано в задании, через рекурсию?
Немного застрял поначалу в первой задаче по минимуму из трёх значений.
Посмотрел следующий урок по Xdebug, вернулся и для большего понимания сделал такой код:
На выходе получается меньшее из трёх. Ух, спасибо, Артём, такие уроки мощно прочищают мозги, заставляют заново крутиться заржавевшие механизмы. Осталось запомнить слово "тернарный"))
Хах) На здоровье! Успехов в дальнейшем обучении!
Так решил задачку с наименьшим числом(необычненько). вопрос есть ли у PHP массив arguments как в js?
Мое решение факториала.
Так получилось без рекурсии последнюю задачу решить
Так додумался с рекурсией
Может быть мое решения кому-то пригодятся или помогут=)
По решениям - всё ок. По вопросу - функция func_get_args(). Но еще можно вот так:
Спасибо, буду читать матчасть!=)
а то что после последнего символа в выводе у него пробел, это ок?
Допустимо. Но будет лучше без него.
Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности. Кто справится и первым напишет верное решение в комментах – тот красавчик и получит от проекта небольшой бонус. UPD: первым справился человек с ником omk. Вариант его решения вы можете увидеть в комментариях.
Здравствуйте! Подскажите почему не работает вариант с декрементом в функции факториала?
рабочий вариант:
Такой вариант выдает ошибку:
Прочитайте про постинкремент и преинкремент.
Если использовать предекремент результат неверный.
Потому что он в выражении выполняется раньше всего остального. Он уменьшает n ещё до того как оно умножается на правую часть выражения. Для того чтобы это понять нужно изучить приоритеты операторов в PHP.
Спасибо за ответы!
Еще можно библиотеку GMP подключить и использовать её фунцию)
Решение
Хорошо. Тип аргумента для факториала тоже бы добавить. И прочитай про типы возвращаемых значений ещё.
Отлично!
Откуда вы взяли значения в выводе? Это типо было 2 в стпени 3, потом стало 2 в степени 2 и умножить на 2 и т.д.?
Запустите этот код и получите этот же вывод. Для того, чтобы его понять, нужно понять как работает рекурсия. Следующий урок - в помощь =)
Первое задание понял вот так:
Спасибо! сейчас вроде сработало)
Теперь норм!
Вот так понял 2 задание:
Верно
разбирайтесь что такое return и как работает присваивание.
var_dump-ов в рабочих функциях быть не должно.
Разобрался, вроде теперь правильно все выводит. Получается у меня не была объявлена переменная $min , а я уже выводил ее через return. Сначала мы объявляем переменную(новую), если мы присваиваем ей наши аргументы в функции; потом совершаем уже действия и только в конце выводим результат.
Этот код отработает так: сначала в $min присвоим $x, затем вернем $min. Получается, просто так присваивали, хотя могли бы сразу вернуть $x.
Теперь все ок.
Второе число не умножается на 2
Если навести на х то будет написано
return завершает работу функции и возвращает то, что справа от него.
Я очень сильно усложнил,но результата добился)
Привет) Это что за алгоритм вообще?)
Решение 4 задачи)
Очень сложно. Рекомендую ознакомиться с другими решениями в комментариях.
Скорректировал, теперь выводятся именно числовое значение
Функция должна возвращать минимальное из переданных чисел. Где типы аргументов?
Правильно ли я понимаю, что возвращать, это означает, выводит на экран в браузере? В скорректированной версии кода, на экран выводится именно числовое значение "$y . ' минимальное значение'".
Типы аргументов указал function minNumber(float $x, float $y, float $z)
Возврат производится с помощью return.
Немного не понял, в этом примере мы создали функцию getSum, у неё в качестве аргументов две переменные, $x и $y, с этим ясно, вот только не пойму, если функция возвращает сумму этих переменных, каким боком она же потом и возвращает сумму переменных $a и $b? Или тут подразумевается, что переменные $a и $b выступают в качестве значений переменных $x и $y?:
Перечитайте урок. В одном случае это аргументы функции, доступные только внутри функции. В другом - переменные, о которых функции ничего не известно. Почитайте в официальной документации об области видимости в PHP.
Спасибо за ваш ответ, и я бы наверное его понял, если бы код был таким:
это к вопросу об области видимости итд.
Вы мой вопрос просто не поняли. Я просто хотел уточнить, что, если мы функцию написали, и её аргументы, к примеру, в общем виде, две переменные $x и $y, то мы потом можем эту функцию многократно использовать, подставляя вместо аргументов любые другие значения и она будет работать или как? То есть, как я это понимаю, поправьте если не прав, имеем функцию:
при вызове функции мы ей передаём значения для её аргументов (не важно, статикой или по ссылкам, не суть, сейчас главное понять смысл), эти значения заменяют значения аргументов в изначальном коде функции и они же подставляются в какой-то исполняемый код в её теле, так?
Да, передавать разные аргументы вы можете сколько угодно раз. Имена переменных внутри функции никак не связаны с именами переменных за её пределами. Они могут быть как одинаковыми, так и разными по имени.
Последнее подсмотрел
Отлично
"Использовать функцию можно только после кода её определения!"
Разве нельзя сначала ее использовать, а потом объявить? Просто так тоже работает, и вроде как программа при компиляции проходит по коду два раза, первый раз для поиска переменных и функций, а второй раз уже исполняет программу.
Почему нет типов у аргументов?
Лень большая сила...
Первое:
Второе:
Третье:
Четвертое:
Выдает: Наименьшее число: 7.5
Что неправильно.
Вот так тогда, да?
Похоже на правду)
Четвертое:
Отлично!
Последний блок else не нужен - просто выполнится в конце, если первые два условия не выполнились.
При входных параметрах
говорит, что минимальное 0.25 - неправильно
Читал, что если идёт одна строка, то можно не ставить скобки. Мол, код так не перегружен скобками
Нужно всегда писать. Это сейчас стандарт в PHP. Скорее всего читали в устаревшем источнике.
Подправил
Отлично!
Функция - минимальное число с плавующей точкой
Функция - умножение по ссылке
Третье задание
Функция - вывод чисел от нуля до заданного
Вторая функция должна умножать аргументы на 2.
Факториал - это произведение чисел, а не сумма.
:) Исправил
Вторую функцию не исправили. И забыли про аргументы функций - где их типы?
Так?
Теперь так)
исправила факториал - посмотрела в комментах, как избавиться от дополнительной переменной. Теперь выглядит так:
Давно это было, я всё подзабыла...
В который раз спасибо за уроки! Прошу проверить код:
Последнее задание делал опираясь на подсказки и примеры в комментах...
Спасибо, замечания учел.
Исправил вывод результата в задании:
Красава
Исправьте отступы в первом задании, ничего не понятно. Переносите все на новые строки, как в уроках. С факториалом та же история. В шторме можно просто нажать CTRL+ALT+L и он сам все отформатирует как надо.
В четвертом задании не нужно использовать exit, это завершает работу всего скрипта. Вам же нужно просто завершить работу функции.
То, что все это работает - хорошо =)
Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
Ок. Оформляйте код (самая первая кнопка в редакторе комментария)
Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
Ок
Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)
Это что-то не то. Прочитайте, что такое факториал. Должен быть только один аргумент.
Действительно, задумался о чем-то...
вот
Ок. Только типы аргументов указывайте.
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
Можно обойтись функцией с одним аргументом. А то что работает - это уже хорошо.
Задача 1:
Задача 2:
Задача 3:
С задачей №4 не справился. Почитав комменты, разобрался) Следующим уроком надеюсь закреплю знания по рекурсии! Спасибо большое за уроки, все очень доступно и понятно! За домашку отдельное спасибо!
Вывод: Минимальное число: 9.3
Да, накосячил..) Спасибо за помощь! Вот, поправил:
Теперь ок
Добрый день, прошу понять почему этот код не работает? Специально не смотрел комменты, хочу сам понять и написать свое решение.
ВОТ ПРАВИЛЬНО
НО ПРОШУ ОБЪЯСНИТЬ
ПОЧЕМУ НЕВЕРНЫЙ 1 вариант
$a <= $b && $c - что вы здесь пытаетесь сделать?
Я думал так можно записать А меньше или равно В и С
Так нельзя. Прочитайте официальную документацию о приоретизации операторов. Здесь выполняется проверка на то что:
($a меньше либо равно $b) И (значение $c, приведенное к булеву типу == true)
function doubleVar(&$a, &$b) {
Забавно, перед отправкой я вспомнил про типы, но потом почему-то решил, что раз это ссылки, то тут типы не нужны) Собственно, я ждал этого коммента, спасибо)
Хех, типы нужны всегда)
Ок. После блока, в котором выполняется return не обязательно писать elseif, можно просто if.
Задача №2.
Типы аргументов не забывайте
Отлично
Это третья задача. Поясните, пожалуйста, вот эта строка в вашей лекции о рекурсии 'return $n + getSumOfNumbersFromZero($n - 1);' означает какой-то цикл? Так как последовательно складывает все числа. Я не понимаю как он узнает, что нужно еще складывать и еще... Пока не будет 1. Т.е. почему он продолжает считать дальше? Мог бы прибавить $n к функции с ($n-1) и на этом остановиться.
Ну, вообще-то он так и делает-останавливается именно на этом. Просто перед этим считает getSumOfNumbersFromZero($n - 1)
Объясните, пожалуйста, как работает код ниже. Если можно построчно что он делает. Не понимаю как он выводит числа по порядку.
Напишите в личку
возвращает
что неправильно.
Фигурная скобка, открывающая тело функции, ставится на следующей строке после объявления имени и аргументов.
По поводу вашего вопроса - в настройках PHPStorm нужно выставить версию PHP не ниже 7.0.
я понял свою ошибку в 4 задаче
А по остальным когда поправите?
Код:
Результат:
Результат: 1
0
10 12
120
0, 1, 2, 3, 4, 5, 6
Вас понял
Вроде всё исправил.
Ок. Ещё заметил, что не указаны типы аргументов во 2 и 3 задачах.
1 задание
Правильно ли я сделал? Смотрю все выполняли данное задание через условия, а если есть уже стандартная функция поиска минимального значения..?!?!
Засчитано. Но по-хорошему стоит реализовать на простейших условиях.
Второе:
Ок
Признаюсь честно - решение подглядел, но потом, вроде бы, разобрался
Вот здесь
не нужно сначала присваивать значение переменной $a. Просто:
Ни одно решение не соответствует задачам и примерам из урока
Теперь отлично.
P.S. Используйте для оформления кода самую первую кнопку в окне написания комментариев.
Первое задание. Стараюсь пока не смотреть подсказки в чате, поэтому наверно много лишнего, когда уже вижу что работает как надо, смотрю варианты для упрощения) Но тут выкладываю что сам навыдумывал для честности.
Функция должна возвращать число.
А так ?)
Так - огонь
Вторая задача, не уверен нужен ли здесь Return в конце функции ?
Неверно. После вызова функции значения переменных должны удвоиться. У вас они остались прежними. Выводить в функции ничего не надо.
Нет. После вызова функции можно сделать echo $a, и значение будет больше изначального в 2 раза. Перечитайте про передачу по ссылке.
Теперь должно работать)
Теперь ок
Третье задание.
ответ 120
Отлично
Хорошо всё с логикой. Замечания только по кодстайлу, в соответствии с PSR:
Во второй и четвертой функциях не хватает типов аргументов.
P.S. Лучше каждое решение отдельным комментарием.
Фигурная скобка, открывающая тело функции, переносится на новую строку.
Откуда у вас взялся оператор and? Пройдите заново урок про условия.
Пробел между именем вызываемой функции и скобкой не нужен. Оператор конкатенации строк с обоих сторон должен быть разделен пробелами.
Если передать 5,5,10, то вернётся 10, что неверно.
Выдаёт ошибку, можете подсказать, что я сделал не так?
Текст ошибки говорит совсем о другом.
Так в чём тогда моя ошибка?
Напишите сюда текст ошибки
Fatal error: Uncaught TypeError: Return value of mult() must be of the type integer, none returned in W:\domains\myproject.loc\www\index.php:4
Написано, что функция mult должна возвращать integer, но ничего не возвращает. Так и есть.
Т.е, каждая функция обязательно должна что-то возвращать? Но дальше я вызываю функцию...
Нет, необязательно. Но вы сам написали :int в её объявлении. Если написан тип возвращаемого значения, значит должен быть return. Исключение - void. Как раз ваш случай.
Вот, работает без ошибки
Ок. Не забывайте открывающую скобку переносить на новую строку. Это стандарт PSR-2.
3 задача
Супер!
первое:
второе:
третье:
Логика - ок. Но не указаны типы аргументов во 2 и 3 заданиях.
Отлично
Для чего return 0;?
ArgMin(5, 5, 5);
Функция ничего не вернёт, хотя минимальное число - 5.
Имена функций пишутся с маленькой буквы.
Пришлите исправленный вариант ответом на это сообщение.
Почему у всех в последнем задании такое сложное решение, может быть я неправильно понял задачу?
Потому что написать простой код сложнее, чем написать сложный код) Всё хорошо, только имена функций должны начинаться с маленькой буквы. Это стандарт PSR.
Просто учил до этого C# поэтому для меня пока немного дико, что методы тоже начинаются с маленькой буквы
Привыкнете, я тоже на нескольких языках пишу с разными правилами
Всё хорошо, только обязательно нужно указывать типы аргументов.
В PHP для блоков if-else всегда используется оборачивание в фигурные скобки.
Поправил
Если передать 5,5,10, то вернётся 10, что неверно.
Поправил
Теперь если передать 2, 3, 1, то вернёт 2. Не торопись.
Еще раз поправил
Теперь ок
Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
Решение:
Отлично
Отлично
Последняя
Что с форматированием? Кто вас учил в одну строку всё лепить? Делайте переносы, как в уроках.
return там ни к чему, функция и так завершится на этом.
Выводит числа не в том порядке. Нужно от 0 до переданного значения.
Исправил, вывод теперь с 0
Форматирование поправил.
Отлично
$number_1 - в именах переменных не должно быть подчеркиваний.
Функцию поиска минимального числа рекомендую написать самостоятельно, хотя формально с заданием вы справились.
ArgumentsByReference - имена методов и переменных пишутся с маленькой буквы.
По логике - всё отлично
Почему при вызове функции внутри себя самой записывается только результат аргументов? Хотя внутри функции также есть выражение, но его просто игнорируют, когда функция вызывает саму себя.(см. код)
Вообще не понял вопроса. Кто там что игнорирует? Вызов функции внутри себя самой не отличается от вызова этой же функции откуда-то ещё.
Последнее задание не мог решить, не учёл, что работа функции приостанавливается на время вызова из неё другой функции, так может и додумался бы. Добавьте пожалуйста этот нюанс в урок, для будущих таких же тугодумов как я)
minFloat - а чего всё в одну строку? Сделай нормальные отступы, как у меня в уроках. Функция должна возвращать значение, а не выводить его.
getFactorialis
Функция не должна возвращать разные типы данных. Если она возвращает int, то никакого false там быть не должно.
Для блоков if-else всегда используйте фигурные скобки. Где-то успели уже нахвататься плохих примеров. Переучивайтесь.
Спасибо за замечания, буду отучаться от плохих примеров.
Как-то сложно. Тут достаточно простых сравнений. Имена переменных ни о чем не говорят. Имена переменных в PHP всегда должны начинаться с маленькой буквы.
Что с отступами? Нужно выровнять.
Непонятно для чего return y, если там всегда null. И для чего echo перед
Разберитесь и исправьте.
Минут 20 вдуплял рекурсию %) Очень понравилось последнее задание)
Отлично, что поняли рекурсию. Исправляйте мелкие недочеты и вперед)
Учту замечания. Спасибо.
Поправил
Супер! Красава!
4 задача, так получилось, не обязательно же через рекурсию
Начнем с того, что это вообще не функция. Рекурсия нужна в этом задании обязательно. Для того, чтобы вы понимали как это работает. Ну и, наконец, логика реализации никак не соотносится с логикой задачи.
Функция должна выводить числа. А здесь нет ни одной конструкции, которая бы что-либо выводила. Вот оно и не работает.
понял, спасибо, все получилось. Спустя 2 дня вроде поняд рекурсию
Тогда жду рабочий вариант)
Где тип аргумента?
Где типы аргументов?
Так же можно сделать?
Нуу, не оч. Хотелось бы увидеть вашу логику в решении задачи.
Для чего вся эта магия?
Захотелось показать альтернативу и возможность использование $$ Переменные переменных
Непонятно, почему максимальное значение 0.0. А если я передам в функцию только отрицательные числа?
getMaxValueUnlimArg(...$_) - здесь проще было сделать именованную переменную и получить на входе массив. Опять же, типы аргументов пропали.
multiplyValue(&$value1, &$value2) тоже типов нет
Не стоит бежать впереди поезда. Лучше делать просто но качественно, чем не до конца понимая как.
Для первой функции правильней было бы указать $maxValue = $value1;
Какой вариант был бы лучшем для решения
p.s. к типам ещё не как не привыкну, учил php ещё 3.х
Ах вот в чем дело. Ну старайтесь переучиваться.
Если передам 3,1,2 то вернёт 2, что неверно.
Если передам 2,1,3 то вернёт 2, и это тоже неверно.
Поправил ошибки
Так ли? А то рекурсия пока сильнее меня, кажется)
Storm ругался на скалярные типы и не давал указать их. Говорил, что только в 7-ой версии доступно и выдавал ошибку синтаксиса, а тут уже 7.4 подъехала. Вот я и решил, что пока так. Да и debug вчера не работал. Вроде исправил. Так?
Скобка, открывающая тело функции, переносится на следующую строку. Где типы аргументов? Как будто урок и не читали. Исправьте, потом остальное посмотрю.
Исправил
Функция должна возвращать числа. Всегда. Если несколько чисел равны и являются минимальными, возвращать любое из них.
Где типы аргументов?
Фигурная скобка, открывающая тело функции, пишется на следующей строке.
Имена функций пишутся с маленькой буквы.
Такое чувство, что урок вообще не читали.
Как-то так.
Пойдет, но можно проще, без суммирования
Расскажите, пожалуйста, как часто в реальной практике используется рекурсия? Нужна ли рекурсия, когда можно воспользоваться циклами?
Рекурсия нужна при обходе древовидных структур данных, при работе с вложенными сущностями. Ну и в математических вычислениях тоже порой позволяет упростить код. Что выбирать, цикл или рекурсию, решает разработчик.
Если передам 2, 2, 3, вернёт 3, что не является минимальным значением.
Вызывается несуществующая функция - var_dump(getMax(5.1, 9.0, 4.4));
То есть ваш код попросту не работает. В следующий раз не буду даже разбирать. Отправляемые решение должно быть как минимум рабочим.
все работает вернет 2
Хм. Мне казалось там не было "либо равно".
там не было = это я ошибся все верно
Теперь отлично
Что с переносами фигурных скобок? Сделайте как в уроке.
Передаю 2,2,3 возвращает 2. false&true=false значит переходим к elseif получается true и возвращает 2. Или что-то я не так поняла?
Прошу прощения, с логикой действительно всё правильно. Исправьте тогда по остальным пунктам.
Спасибо, по остальным все понятно, исправлю!
Исправил
Возвращает 3
Минимальное значение
4
Ссылки
8
10
факториал
6
Пересчет до нужного числа
int(10) int(9) int(8) int(7) int(6) int(5) int(4) int(3) int(2) int(1)
Где типы аргументов?!
Поиск минимального числа должен быть среди трёх чисел. Функция должна возвращать минимальное число а не строки!
Последняя функция тоже неправильно работает.
Ужасно. Перечитайте и урок и домашнее задание.
ПОКАЗАЛО
2.01
8
10
60
1
2
3
.
На счет последнего еле как допер, как это сделать)
Не нужно. Возвращайте любое из минимальных. Функция всегда должна возвращать float.
minValue(2.01,2.01,2.3)
Вообще ничего не возвращает.
И опять в двух функциях типы аргументов не указаны. Куда спешишь?
Последнее сделано слишком сложно. Там можно без всякой арифметики. Но то что работает - уже хорошо.
Кстати, у меня проблема с понятием рекурсии) Как она работает? Почему нужно писать "$a * power($a, %n-1)", а не просто "$power($a, $n)"?
Посмотри другие уроки в интернете. Спросил полную ерунду, именно из-за того что не понимаешь. Пока не поймёшь - не берись делать.
Видео записано 2 года назад, сейчас declare стали чаще применять?
Я бы не сказал)
Привет! ДЗ 1й. проверьте пож.
Передал 1,2,2 - вернулось 2. Неправильно.
Извиняюсь за простыню =)
В первом примере напиши логику самостоятельно, хитрец ты эдакий :)
Последний пример падает с ошибкой. Хоть бы проверил его перед отправкой сюда.
showNumb - ок. Но можно было обойтись одной функцией.
Теперь работает. Но во втором условии можно опустить часть про $b <= $a, так как в первом условии мы уже выяснили что $a не минимальное и сравнивать с ним второй раз смысла не имеет.
Для блоков if-else в PHP всегда используются фигурные скобки.
где типы аргументов? в следующих двух задачах тоже самое.
Поправьте, пожалуйста.
Отлично!
IntNumbers - имена функций пишутся с маленькой буквы
If пишется тоже с маленькой.
Используйте в верхнем левом углу редактора комментария кнопку "код", чтобы звездочка не пропадала.
Скобка, открывающая тело функции, переносится на следующую строку.
что за зубодробительная конструкция?
Для чего комментарии? Какие контейнеры? Нет такого понятия в PHP!!!
В домашнем задании нет ничего похожего на то, что вы сделали. Для чего это здесь?
Скобка, открывающая тело функции, переносится на следующую строку.
В задании нужно было находить минимальное значение, а не максимальное.
Так нельзя:
Для конструкций if-else всегда используются фигурные скобки!
Функция содержит в имени min, а ищет максимальное. Ошибка именования.
А где отступы? Почему всё на одном уровне? Поправьте, так невозможно проверять.
Писал и выполнял на андроиде, поэтому получилось без пробелов. Попробовал добавить табуляции здесь и вставить в phpstorm (+ добавил решение последнего задания с рекурсией), но теперь браузер пишет error unexpected end of file, не проверяется. Извините, что отнял время...
Писал сразу после прочтения темы как понял не чего не исправляя, с целью получения опытного комментария :)
Куда подевался тип аргумента?
Аналогично.
Почему выводите только чётные?
Выводить нужно начиная с нуля, а не наоборот.
Ой да первый раз прочитал мне показалось что четные только надо выводить.
А по поводу типа аргумента указывать его считается хорошим тоном или это правильное написание и так должно быть обязательно всегда?
Работать будет и без него, но писать нужно, позволяет избежать многих ошибок. Так вы всегда знаете, что за тип, и что с ним можно, а чего нельзя делать.
факториал
getSumMultiplication, getSumMin - почему в названии присутствует Sum? Здесь разве что-то суммируется?
функция факториала не должна ничего выводить, она должна возвращать число!
Переменные исправил. А вот про факториал не понял...
Значение возвращается с помощью return, выводится с помощью echo. В задании про вывод не было ни слова. Так почему в вашем коде есть echo?
Ругается, что не может переопределить функцию, но не могу понять, что именно не так ..
В PHP уже есть функция с таким именем. Назовите по-другому.
Куда пропали типы аргументов?
Фигурная скобка, открывающая тело функции, пишется на следующей строке.
Блоки if-else всегда оформляются с помощью фигурных скобок.
Что ещё за echo в функции, которая должна вернуть число? Она не должна ничего выводить!
Ну всё же абсолютно по-другому в уроке было, где вы этого нахватались? Привыкайте сразу писать правильно. Рекомендую исправить по всем пунктам.
Принято, спасибо!
Правильно ли я понял, что когда использую имя встроенной функции, ругается именно таким образом? Тип аргументов убрал, пока пытался разобраться, в чем именно проблема.
Набрался то там, то сям, я и условия задачи слегка исправил, чтобы не шаблонные решать, а хоть что-то свое.
Про фигурные скобки понятно, но я где-то вычитал, что если в блоке if else только одна одна стрОка, то фигурные скобки не обязательно, хотя наверное правильно сразу приучать себя их ставить..
echo в функциях вообще никогда не используется ? Я думал, что функцией можно сократить кусок кода, чтобы его не повторять каждый раз, или я что-то не так понял? Что ещё нельзя использовать внутри функций? Где прочитать ?
По правилам PSR всегда нужно ставить.
Используется, когда нужно выводить. В задании же сказано, что функция должна возвращать что-то, про выводить ничего не было сказано, значит не нужно.
Результат на скрине: https://prnt.sc/ql9tyk
minOfFloats - Эта функция у вас ничего не возвращает. Читайте заново про return.
multiplicationOnLinks - OK
factorialByRecursion
Либо возвращайте, либо выводите. Мешать не нужно. В вашем случае будет достаточно просто возвращать null.
Исправил, чтобы результат выводился не через echo, а возвращался через return
Уберите комментарии
Как думаете, можно ли в первой функции заменить elseif на if?
Фигурная скобка, открывающая тело функции, переносится на следующую строку.
Лучше чтобы функция возвращала значения одного типа, либо null, когда что-то идет не так. Чуть позже мы рассмотрим механизм обработки таких ситуаций.
В остальном, по логике - всё отлично.
> Как думаете, можно ли в первой функции заменить elseif на if?
Можно, результат будет тот же, но код выглядит более понятным, верно?
> Фигурная скобка, открывающая тело функции, переносится на следующую строку.
Спасибо, обязательно учту.
> Лучше чтобы функция возвращала значения одного типа, либо null, когда что-то идет не так. Чуть позже мы рассмотрим механизм обработки таких ситуаций.
Хорошо
1 задание:
2 задание:
3 задание:
4 задание
Отлично. В последнем задании только тип аргумента не указали.
4 Задание
Ок, а сможете реализовать с помощью рекурсии?
1 задание
2 Задание
3 задание
если включено расширение gmp php можно так:
4 задание
Ну раз уж используете готовую функцию, то сразу
Незачем объявлять лишнюю переменную.
Спасибо!
Отлично
Вы в условии выполняете присваивание! Перечитайте урок про условия.
Отлично. Только скобка, открывающая тело функции, пишется на следующей строке.
return $x * power($x, $n - 1);
Зачем от $n отнимать 1?
Чтобы возвести число в степень n-1
Здравствуйте, почему в этом коде у меня высвечивает ошибку?
Здравствуйте. Нужен текст ошибки, чтобы понять что именно у вас ломается.
Также нарушен кодстайл. Скобка, открывающая тело функции, пишется на следующей строке.
Какая ошибка? Версия PHP > 7.1?
Простите, у меня оказывается стояла 5-ая версия PHP, вчера обновил до 7-ой версии.
Ок)
Нужно указывать типы аргументов.
2.
Отлично
1.
Отлично
Вторая задачка:
Почему не указали типы аргументов?
Другое дело)
В примере это у вас не написано.
В той части статьи еще не дошли до тайп-хинтинга
Отлично, только отступы почему-то пляшут.
elseif пишется на той же строке, что и }, после которого он идет. Хотя здесь можно elseif заменить на if, потому что если первое условие выполнится, то программа завершит свою работу тут же. А иначе... уже можно дальше просто if-ом проверять. Логика та же, по которой вы не стали оборачивать return $c; в блок else.
А типы аргументов где? =)
Правильнее так:
Открывающая фигурная скобка пишется на новой строке
Для чего столько скобок?
Правильная запись:
Кроме того, elseif здесь можно заменить на if, так как в блоке выше выполняется return.
Закрывающий тег не нужен.
Ну и, наконец:
Выведет 5, что неправильно.
Переходим ко второму заданию.
Для чего здесь скобки? Нужно убрать.
Третье задание:
можно заменить на:
и результат, возвращаемый функцией, не изменится. Но код упростится.
Четвертое - ОК.
Ну а как вы поймете, в какой момент нужно остановиться?
Здравствуйте. Вариант третьей задачки.
Не было такой домашки
Тогда так:
Теперь ОК)
Первая задача
Вторая задача
Третья задача
Четвертая задача
{ с новой строки пишется!
Результат:
Минимальным числом из 3; 2; 7 является число 2
Результат:
После умножения чисел 3 и 5 на 2
Получаем числа 6 и 10 соответственно.
Результат:
Фактериал числа 7 равен 5040
Результат:
Целые числа от 0 до 7
0, 1, 2, 3, 4, 5, 6, 7
Результат:
Минимальным числом из 3; 2; 7 является число 2
После умножения чисел 3 и 5 на 2
Получаем числа 6 и 10 соответственно.
Факториал числа 7 равен 5040
Целые числа от 0 до 7
0, 0, 1, 2, 3, 4, 5, 6, 7
Спасибо, с if код стал намного проще!
Первый ещё вот так можно сделать:
И четвёртый исправил на:
теперь результат:
Целые числа от 0 до 7
0, 1, 2, 3, 4, 5, 6, 7
Всегда для if-else используйте фигурные скобки. В остальных примерах аналогично.
По логике замечаний нет
Спасибо, исправил.
Не всё исправили. И переносить на новые строки нужно то, что внутри скобок.
Вот так сделал:
Всё правильно?
Ага, теперь огонь. Из улучшений - в факториале можно опустить else
Вот так?
Только не надо лепить все в одну строку) Перенесите return на следующую
Ну теперь совсем красота)!
Теперь да)
Результат:
Минимальное число: 16
Результат умножения: 6, 8
Факториал числа 4 равен: 24
0
1
2
3
4
5
p.s. 4ую задачу пришлось подглядеть, не до конца сам допер((
Первую задачу можно решить с помощью функции min()
И объясните пожалуйста как записываются и хранятся значения $x в 3ей и 4ой задачи. Я понимаю что это работает как "счётчик", но почему когда вызываешь функцию внутри функции, то $x берётся как $x -1(всегда уменьшенный на 1), а не один вычитается из полученного за прошлый раз значения, например
в факториале после 1 прохода получается 12, то почему далее берется не 12-1, а 3-1.
На вашем примере со степенью всё понятно, там $n не трогают, а вот как это работает с одной переменой, не понятно. Надеюсь поняли о чём я.
А так мне материал понятен.
На прошлом шаге мы уже поняли, что x не минимальное. С ним сравнивать уже не имеет смысла.
Факториал нуля - единица
В каждом вызове функции эта переменная своя. Текущий вызов функции ничего не знает о той переменной в функции, из которой она была вызвана. Смотрите видео из следующего урока. Должно стать понятнее.
1ое задание
3ее задание
Теперь все задания ок??
Скобка после условия пишется на той же строке. И нужно соблюдать отступы. Если пользуетесь PHPStorm, там можно просто нажать сочетание клавиш CTRL+ALT+L
Понял, редактировал)
p.s. Артём, может поправить эту строку: "А сейчас убираем строку _declare(stricttypes=1); из нашего кода и идём дальше." Убрать нижнее подчёркивание перед declare и поставить между strict и types, чтобы как надо было)
Спасибо, поправил
Результат:
Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
a = 4
b = 3
c = 1
Минимальное значение: 1
Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
a = 3
b = 4
2a = 6
2b = 4
Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного).
x = 5
x! = 120
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
x = -10
Ряд: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
2.
Красота
У меня вопрос.
Почему рекурсия, а не цикл? Просто для того, чтобы в этой теме рекурсию изучить? Или это потребует меньше ресурсов при вычислении?
Просто, например, как в третьей задаче:
, так и в последней -
фактически проще циклом пробежаться.
Или рекурсия все же предпочтительней? Если да - почему?
Дополняю комментарий ответами.
Буду честен - 3 и 4 задания ответы подсмотрел в комментариях других участников. Не дается мне пока рекурсия :(
Это просто примеры рекурсии. Но есть некоторые алгоритмы, которые реализуются с помощью рекурсии более элегантно, а есть, которые реализуются только с помощью рекурсии. О них позже.
2.
3.
Но, на второй итерации копипасты в процессе дебага кажется начало приходить легкое подобие понимания рекурсии...
Теперь ок
Четвёртое задание подсмотрела в комментариях. Трудновато даётся понять логику. Надеюсь с этим справится.
Пробелы добавляйте
Скобка, открывающая тело функции, переносится на новую строку
Если используете PhpStorm, эти проблемы решаются нажатием сочетания CTRL+ALT+L
С логикой всё отлично, а вот оформление страдает.
Не забывайте оформлять код! Первая кнопка в редакторе комментариев.
Типы аргументов почти везде отсутствуют.
Фигурная скобка, открывающая тело функции, пишется на следующей строке.
В блоках if-else всегда пишутся фигурные скобки. Делайте как в уроках написано. То как у вас нарушает все правила PSR.
Рекурсию часто можно заменить циклом. Но решение с помощью рекурсии зачастую более выразительно и читается человеком проще.
Имена функций пишутся с маленькой буквы. Где типы аргументов? Факториал нуля - единица. Функции не должны ничего выводить, они должны возвращать. getMinFromThree не читаемая от слова совсем, тернарный оператор тут не к месту. Нужно всё переделать.
Добрый день !Спасибо за проверку! Вроде как все переделал , посмотрите пожалуйста.
Функции не должны ничего выводить, только возвращать.
Вы имеете ввиду echo внутри функций? echo "Функция -2 аргумента -возвращает по ссылке</br>";-вот это ?
Да
Спасибо! Теперь понятно ,надо ли переделать?(убрать эти строки) и переслать?
Конечно :)
А нужно ли это в факториале?
Где типы аргументов?
Вы не поняли смысл передачи по ссылке
Добрый вечер! Да, действительно
явно не к месту)
С остальным все доработаю.
Ок) сообщите, как поправите)
Доброе утро!
Отлтично!
решение предыдущей задачи с учетом возможности ввода отрицательного числа, и не целого
Фигурная скобка по уроку везде переносится на следующую строку. Почему пишете так?
Сломал себе всю голову. Позвольте я расскажу, как я "читаю" эту функцию, а вы, если найдете время, наставьте, пожалуйста.
$n уменьшается на единицу и за счет обращения функции к самой себе - она начинается сначала.
Вот...
Судя по вардампу переменная х во всех циклах не менялась и оставалась двойкой.
int(2) int(3) int(2) int(2) int(2) int(1)
Мне, хоть убей, не понятно - за счет чего получается 8.
Сори, если глупость пишу, самому стыдно.
Но я что-то вообще никак.
Ну всё правильно, $x ни в одном вызове не меняется. Посмотрите видео из следующего урока.
Сделала последнее задание двумя способами - с помощью рекурсивной функции и массива.
Фигурная скобка, открывающая тело функции, пишется на новой строке!
Некорректно работает
можно опустить else, потому что если if выполнится выше, произойдёт return:
Факториал нуля - единица.
По getInt - в задании сказано, что функция должна выводить, а не возвращать.
Спасибо за комментарии, свои ошибки поняла.
Проверила еще раз функцию minFloat, дело в том, что было задано два одинаковых числа, а я не прописала это в условии. На будущее запомню и буду обращать внимание на это)
Лучше исправьте и пришлите заново :)
else пишется на той же строке, что и закрывающая скобка блока if:
После имени функции пробел не ставится.
Делайте оформление как в уроках. Оно соответствует стандартам PSR.
Ну и в целом тут можно опустить else, так как в if-е уже есть return.
Тогда и в объявлении функции не должно быть пробела между именем функции и открывающей скобкой аргументов:
Немного путает то, что в замыканиях должен быть пробел между словом function и открывающей скобкой, а в объявлении функций, методов - нет.
П.С.: Если код вложен в цитату - markdown не не воспринимает отступы в начале строки. Или нужен какой-то специальный формат записи такой вложенности?
Да не, это баг в парсере markdown. Нужно добавлять перенос строки после цитаты.
Верно.
Так пробел после слова function остаётся, просто в замыкании имени нет, сразу идут аргументы.
//Задание.1
function getMini (float $x,float$y,float$z){
if ($x <$y and $y<$z){
return $x;
}if ($y <$x and $y <$z){
return $y;
}
return $z;
}
$a=50.5;
$b=136.8;
$c=-5.90;
echo'Наименьшее число:'. getMini($a,$b,$c);
echo '<br>';
//Задание.2
function getMulti (&$a,&$b){
$a =2;
$b =2;
}
$x =3;
$y =5;
getMulti ($a,$b);
echo 'Перво числое:'.($x) 2;
echo '<br>';
echo 'второе число:' .($y) 2;
echo '<br>';
//Задание.3
function getFact ($x)
{
if($x == 0){
return 1;
}
return $x * getFact($x-1);
}
$a = 3;
echo 'Факториал числа ' . $a .' = '. getFact($a);
P.S.Последнее задание не стал делать,чтобы не обманывать себя и тебя.Третье подглядел но вроде понял.
А код оформить? Кнопка в редакторе комментария такая есть :) Как поправишь - напиши ответ на этот комментарий, проверю домашку после этого.
and - откуда взялось? Мы разве так писали?
Возвращает 2, что неверно.
Откуда взялся третий аргумент?! Где типы данных?
Куда пробелы убежали между типом и именем переменной?
Функция по-прежнему неправильно работает, как и выше.
Тут вообще нерабочий код. Для чего 2 аргумента?
Ок. На ошибках учатся.
Вообще это двоеточие во всех примерах у вас присутствует. Значит вообще ни одно решение не является рабочим.
А все понял. Я это двоеточие ставил для того ,чтобы отделить код от комментов (://). Я не писал его в коде. На будущее учту))
Ок. Тогда нужно поправить первые два задания.
Я переделал. Как на этот раз?
Отвечайте на комментарии, а не добавляйте новые! Для этого справа от комментария есть стрелочка.
Возвращает 2, что неверно.
Где типы аргументов у второго и третьего решений?
Почему функция называется power?
Типы аргументов нужно указывать обязательно? Я правильно понял?
Функция не может называться power?
Я не нашел такой зарезервированной. Видел только pow
А почему power, если она факториал считает? Название должно отражать то, что она делает.
Везде где можно, следует указывать
Теперь minNumb(2, 2, 3) вернёт 3 :D
Отлично
Задание 1 (может быть слишком нагромождено, но мне просто пока что легче по одному шагу расписывать)
Задание 2
Задание 3
С четвертым заданием сам не справился, в комментариях посмотрел решение и разобрался, что к чему
Во втором задании функция не должна ничего выводить. Проверять значения нужно за пределами функции и после её вызова.
Факториал нуля - единица
В последнем задании была проблема с ВЫВОДОМ. Так и не решил, подсмотрел в комментариях.
Но уже после осталось непонятным как работает оператор return; без какого-либо значения. Можете объяснить?
Где типы аргументов в первых двух задачах?
return завершает работу функции и возвращает то, что справа от него написано. Если ничего не написано, значит возвращает ничего, то есть null.
Спасибо, теперь понятно!
Код обновил!
Для блоков if-else всегда пишутся фигурные скобки! Оформляйте код как в уроках.
Где типы аргументов?
Для чего return в конце?
Где тип аргумента?
Факториал нуля = 1
Исправил.
function factorial(int $n)
Что за or? Используйте для ИЛИ ||.
Для чего два условия, когда можно ограничиться одним?
Точняк)
Вообще-то я имел в виду
День добрый! Я знаю, что последняя задача решена неверно (порядок цифр не тот), так еще и коряво. Просто хотела показать, что сама смогла додумать. Следующий урок пока не смотрела.
Я посмотрела Ваш пример правильного решения задачи, и от этого еще больше путаницы возникло: я думала, что return должен возвращать что-то конкретное, тогда как в примере после него ничего нет. Какую роль тогда он выполняет в данном случае?
Достаточно
Для чего скобки?
Пробел не нужен.
Завершает работу функции. Это то, что он делает вместе с возвратом значения. Если справа от него не указано значение, возвращается null, то есть "ничего".
В данном случае прописала именно так для правила факториала, если значение = 0.
Скобки там по невнимательности)
Вроде начала понимать, как это работает: После выполнения условия, когда $x == 0, функция дает команду на выведение значения, завершается цикл, и тогда начинают выводиться, раннее выполненные действия.
Там нет никакого "выведения". Внимательно прочитайте про return еще раз. И в документации тоже прочитайте.
4 задание
Почему не указан тип второго аргумента?
Можно одним аргументом обойтись, второй не нужен.
Если убрать аргумент 'i', то выводить будет в обратном порядке. Не 0, 1, 2, 3 ... а ..., 3, 2, 1, 0. Можно сделать так, но таких решений выше много, а хотелось что-то уникальное.
Не нужно уникального, надо простое)
Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения.
Достаточно
Лишний перенос
Используй конкатенацию строк.
Исправил, проверь, пожалуйста.
Отлично
Задание 1:
Задание 2:
Задание 3:
А первое задание сможете решить без помощи встроенной функции?
Скобка, открывающая тело функции, пишется на новой строке.
После имени функции пробел не нужен.
Где типы аргументов?
Что с форматированием? Пишите как в уроках.
Для этого в шторме можно нажать Ctrl+Alt+L
Задание 1:
При получении аргументов по ссылкам также нужно приводить тип аргументов? Например если в источнике ссылки переменные типа float, а мы приводим их к int? Или я не так Вас понял?
Прошу прощения. Писал код в sublime text. В следующих заданиях буду учитывать замечание.
Нужно заменить на
Да, всегда стоит указывать.
Это мое решение
<?php
function factorial($a)
{
if($a == 0){
return 0;
}
if($a == 1){
return 1;
}
}
echo 'Рузультат : '. factorial(1);
?>
но посмотрев все ответы очень понравилось
<?php
function factorial(int $a)
{
if($a < 2)
return $a;
}
echo factorial(0);
?>
Оно тоже правильно работает с 0 и очень понятное и короткое!
Оформляйте код (в редакторе комментариев самая первая кнопка).
Как поправите - напишите. Проверю ДЗ
Всегда используйте фигурные кавычки для блоков if-else
whoIsLessNumber(1,1,2) возвращает 2, что неверно
Проблема с форматированием. Делайте отступы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Теперь отлично
Потеряли тип аргумента
И проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Вернуло 2, что неверно
Теперь ок
Спасибо за ревью кода! :)
Пожалуйста)
Артем, не подскажете, почему PHP не ругается если в функцию где в аргументах указан тип float передать int? Если сделать наоборот то сразу выскакивает ошибка.
Работает автоматическое приведение типов. Если хотите чтобы типы были всегда такими, как написано, можно использовать директиву strict_types (погугли самостоятельно)
Директиву strict_types использовал, нашел вот такой ответ "Единственное место, где режим строгой типизации позволяет автоматические преобразования — из int в float."
Сейчас еще раз перечитал вопрос и понял, что в первый раз ответил не совсем про то. int можно безболезненно преобразовать во float, просто добавится .0
Если же float приводить к int, то придется отбросить часть после запятой, что некорректно. Ну а вообще не стоит никогда полагаться на автоприведение, всегда делайте это явно.
Отлично
Всегда используйте фигурные скобки для блоков if-else.
Или даже так можно :)
Всегда используйте фигурные скобки для блоков if-else.
getMin(2, 3, 1) возвращает 2, что неверно
Работает. Но не стоило для этого добавлять еще одну функцию. Рекомендую ознакомиться с другими решениями в комментариях.
Ну или использовать эту функцию по-максимуму
Где типы аргументов?
Факториал нуля равен 1, это тоже стоит учесть.
Лучше ДЗ для одного урока отправлять одним комментарием. Так будет проще и мне и вам)
Отлично
Первое и второе задание не составило большого труда сделать, но вот на 3ем задание пришлось обращаться в справочник PHP. 4 задание слишком пока сложновато для понимания, оставлю на потом...
Надеюсь в будущем это уже всё укомплектуется в голове и не будет таких тугодуманий над рекурсией)))
возвращает 2, что неверно
Скобка, открывающая тело функции, пишется на новой строке.
Где типы аргументов?
Всегда используйте фигурные скобки для блоков if-else.
Проблема с форматированием. Делайте отступы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Хорошо, я учту всё выше сказанное.
Благодарю вас за обратную связь, работа над ошибками это составляющая часть обучения. В дальнейшем надеюсь такие ошибки не совершать!)
Пожалуйста)
У нас принято делать работу над ошибками - в ответ на мой комментарий пришлите вариант с исправлениями
Подправил, проверил на валидность, в итоге всё нормально.
Скобку тут перенёс.
Подправил, посмотрел ход действий через Xdebug. Всё работает получилось 45, вместо 46.
Типы аргументов в последних двух решениях пропустили
А где типы аргументов?
var_dump нужно убрать.
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Факториал нуля = 1
Если передать 0, программа уйдет в бесконечную рекурсию и завершится с ошибкой
Привет, немного не поняла. Поправь, если не права. Задание было найта факториал от 1 до заданного числа. Моя программа при переменной, равной 1, заканчивает работу. Причём здесь 0 и бесконечная рекурсия?
Я поняла, ты имеешь в виду, работу программы, если задать число, до которого считается факториал, равным 0?
Факториал нуля = 1. Ладно, забейте, и так пойдет)
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Лучше разделять числа пробелами или запятыми, а то так сплошняком идут, не понятно.
Исправила!
Отлично
Всегда используйте фигурные скобки для блоков if-else, for, foreach.
Где типы аргументов?
Такой синтаксис для массивов устарел. И для чего здесь вообще возврат этого массива?
Факториал нуля = 1, это корректное значение.
Это вообще что такое? Строки пишутся в одинарных кавычках. Для чего здесь скобки? В конце выражения ставится ;. Только одно выражение на строку.
Пишите, как в уроках, пожалуйста. И лучше пока отложите в сторону учебник или что там, откуда вы успели начерпать всего этого ужаса :)
Ну это вообще дичь) Рекомендую вам идти строго по материалам курса и пока его не пройдете вообще не рассматривать альтернативные источники.
Проверяла на http://sandbox.onlinephpfunctions.com/ Выдает то, что задано.
Идею рекурсии я поняла. Пока сложно думать на языке программирования. Поэтому задания делала скорее интуитивно, чем осмысленно.
1.Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
3 . Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного).
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Закрывающий тег ?> в конце файла не нужен.
Всё так)
Я и в первый раз вставляла оформленный в шторме код и в шторме он выглядел ничего так...
Каюсь, чтобы не делать отдельных файлов просто запхнула все в хтмл, поэтому и использовала закрывающий тег.
--- Может стоит к оформлению кода добавить до и после кавычек отступы? А то я пока поняла, что стоит код отделить от текста дополнительными переводами строк, такого наформатировала... Это из-за неправильно расставленных абзацев код отображался неправильно.
(Т_Т Рекурсия по сравнению с оформлением и настройками всех компонентов для организации обучения - просто детский лепет. Чувствую себя, словно осталась всего одна извилина, и та прямая.)
Не могла понять, почему в первом задании можно опустить else. А тут пришла мысль: Если первое условие выполнится, то после return функция просто завершится. В противном случае продолжится чтение условия. Получается, что если бы не было return опустить else было бы нельзя?
В любом случае, спасибо вам, за ваше такое полезное хобби ))
Да, опустить можно именно из-за return
Оформляйте код (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте, пожалуйста. А потом ответьте мне на этот комментарий. Проверю домашку после этого.
Оформил
Всё отлично, но проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
3-е задание
Оформляйте код (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте, пожалуйста. А потом ответьте мне на этот комментарий. Проверю домашку после этого.
Гуд
Лишний перенос строки после скобки, открывающей тело функции. В остальном - отлично.
Долго разбирался с последним заданием, всё понял ))
Немного усложнил и вывел только чётные числа.
Всё отлично, но есть проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Где типы аргументов?
Скобка, открывающая тело функции, пишется на новой строке.
в решении 3 задачи ошибка:
должно быть:
Спасибо, исправил.
Оформляйте код (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте, пожалуйста.
3)
Скобка, открывающая тело функции, пишется на новой строке.
Закрывающий тег ?> в конце файла не нужен.
нарушен отступ
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
4)
Те же недочеты
Четвертое задание действительно показалось сложным, воспользовался подсказкой, а потом сделал вывод в обратном порядке. В общем получилось два варианта. Так делают?
Да, всё норм
1-e
2-e
3-e
4-e
Остальные ок
Чет ерунда какая-то. Условия разве так пишутся? Откуда там точки с запятой после if взялись?
да напортачил надо исправить
Пересмотрите урок про условия)
Отлично. Только отступы немного поехали
Всё отлично, но проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
вместо and пишите &&. в остальном - всё супер
Отлично
Я не понимаю как работает код:

в строчке: return $x * power($x, $n - 1);
как функция понимает что $n-1 это степень, что $x надо умножать на себя n-1 раз, этого нигде не прописано, т.е. выглядит так буд-то функция обращается сама к себе, но все что в ней есть это: if ($n == 1) {
return $x; и к чему тут обращаться?
Пройдите следующий урок, с дебаггером многим становится понятнее.
Привет, а можно так?
А где типы данных?
Отлично!
getMin(2, 2, 3) возвращает 3, что неверно
Где типы аргументов?
Где типы аргументов? Скобка, открывающая тело функции, пишется на новой строке.
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Закрывающий тег ?> в конце файла не нужен.
Спасибо поправила.
Теперь getMin(2, 2, 1) возвращает 2
Теперь отлично
Спасибо!
<?php
function MinX(float $x, float $y, float $c){
if ($x > $y & $x > $c){
return $x;
}elseif($y > $x & $y > $c){
return $y;
}else return $c;
}
echo 'результат: '.MinX(3, 6, 7).'<br>';
function Ahref(&$a, &$b){
$a = $a2;
$b = $b2;
echo $a.' , '.$b;
}
$h = 4;
$l = 5;
Ahref($h,$l);
function getSumOfNumbersFromZero(int $n)
{
// Если сейчас 1, то просто возвращаем 1
if ($n == 1) {
return 1;
}
}
echo '<br>'.'Результат: ' . getSumOfNumbersFromZero(6).'<br>';
function numbers(int $n)
{
// Если сейчас 0, то просто возвращаем 0
if ($n == 0) {
echo 0;
return 0;
}else
{
}
numbers(15);
?>
Оформляйте код (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте, пожалуйста. А потом ответьте мне на этот комментарий. Проверю домашку после этого.
А типы аргументов где?
Можно заменить сразу на
Типы агрументов не нужны, чтобы работало на float и на int. Так и было задумано.
Тогда ок)
1 задание
2 задание
3 и 4 пока не понимаю, или не до конца, завтра на свежую голову еще раз пройду рекурсию)
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
пишет 2, что неверно
Нужно указать типы аргументов
getMinFrom3(3,2,1) возвращает 2, что неверно.
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Нужно указать типы аргументов
getMinFrom3(3,2,2) - возвращает 3
Первые довольно простые задания, второе из-за невнимательности много времени потратил...
КОД
Результат
0
1
2
3
4
5
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу.
Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение;
Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
А почему всё закомментировано?
Здравствуйте!
Исправил )
выводит ошибку. По заданию эта функция должна возвращать значение, а не выводить.
Спасибо!
Исправил )
Что-то не вижу исправлений. Давайте их ответом на этот комментарий
Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение;
Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
num(1, 1, 1) ничего не возвращает.
Где типы? Где передача по ссылке?
Где типы?
Здравствуйте. Что я делаю не правильно? Если я хочу вывести значения.
У вас функция ничего не возвращает, так что и ничего не выводится.
После ее выполнения выведите значения переменных:
В 2 и 3 не указали типы аргументов.
Скобка, открывающая тело функции, ставится на отдельной строке. Это стандарт.
В первом задании выполнил сравнение переменных, может код и не сильно красивый, но он работает))
К сожалению или к счастью решить 4 задание смог только таким методом, через 2 функции.
Посмотрел работы однокурсников, да, что то я не совсем понял как работает функция по моему.
был близок но не дошел до решения, не совсем понял что делает return, ниже пример кода
позже переделал конечно на
Но это уже после того как посмотрел ((
Ух. Что-то вы переборщили. Я просто порекомендую внимательно изучить примеры других решений к этому уроку в комментариях. Обратите внимание на ошибки.
Решение засчитывается. А сможете самостоятельно реализовать логику, не используя готовой функции?
Почему в примере возведения в степень, рекурсия заканчиванется при n==1 с возвратом основания, а не при n==0 с возвратом единички?
Да, согласен, так будет правильнее. Поправил. Спасибо за замечание!
Всё отлично, но проблема с форматированием. Сделайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
ФАКТОРИАЛ
Всё отлично, но проблема с форматированием. Сделайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
РЕКУРСИЯ: Сумма от 0 до 5
Всё отлично, но проблема с форматированием. Сделайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L.
P.S. Скидывайте к одному уроку один комментарий, пожалуйста
Умножаем входные данные по ссылке на 2
Не указаны типы аргументов
Вывод наименьшего из 3-х чисел типа float
Функция по заданию не должна ничего выводить, она должна возвращать.
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Скобка, открывающая тело функции, пишется на новой строке.
В остальном отлично
По первому упражнению увидел что два условия можно проверять вместе когда уже своё сделал, но не стал менять чтобы просто не копировать. Можно вопрос: Это обязательно делать строгое сравнение в функции если мы и так определям какой тип аргумента будет передаваться? Вначале я сделал просто сравнение (==).
Отлично.
Необязательно, но приветствуется. Строгое сравнение гарантирует что типы совпадают.
minFloat(1, 1, 2) возвращает 2, что неверно
Скобка, открывающая тело функции, пишется на новой строке.
getMin(1, 1, 2) возвращает 2, что неверно
Отлично
{
if ($x < $y && $x<$z) {
return $x;
} elseif ($y < $x) {
return $y;
} else {
return $z;
}
}
$a = 3.1;
$b = 3.2;
$c=3.3;
echo 'Наименьшее число: ' . getMin($a, $b, $c);
Result: Наименьшее число: 3.1
function multiplyBy2(int &$x, int &$y)
{
$x = 2 $x;
$y = 2 $y;
}
function factorial(int $x)
{
if ($x === 0) {
return 1;
}
return $x * factorial($x - 1);
}
if ($x === 0) {
echo $x;
return;
}
numbers($x - 1);
echo ', ' . $x;
}
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу и отвечу на вопросы.
Мой вариант решения первого задания:
Совершенно нечитаемый код. Нужно исправить оступы и переносы строк, чтобы было как в уроках. Скобка, открывающая тело функции, пишется на новой строке.
Если передать 3, 3, 3 то вернётся 0, что неверно.
Поправил, при передаче 3 3 3 возвращает 3
Всё отлично, но проблема с форматированием. Сделайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Супер! Всё правильно и с оформлением всё отлично. Только скобка, открывающая тело функции, пишется на новой строке.
Здравствуйте! Решение последней задачи:
Всегда используйте фигурные скобки для блоков if-else.
Последние задание вызвало трудности - пришлось подсмотреть, понимание появилось.
Ок) А самостоятельно сможете реализовать логику?
Потеряли типы аргументов
Всегда используйте фигурные скобки для блоков if-else.
Тут я её самостоятельно и реализовал. Первые три задания делал не глядя в комменты, только 4 " вызвало трудности - пришлось подсмотреть, понимание появилось."
Типы int упустил =(
Не хватает скобки? Тут не понял
elseif должен быть на той же строке, что и закрытая скобка, после пробела.
Где типы аргументов?
Факториал нуля = 1
Если я использовал вместо === с привидений типов ==, то это считается как ошибка?
должно быть
=>
Нет, но более строгое сравнение предпочтительнее. У вас же гарантированно здесь совпадают типы, поэтому лучше использовать его.
Здравствуйте! Вот, вроде все работает)
getMin(2, 2, 1) возвращает 2, что неверно.
Где типы аргументов? В остальных то же самое.
Скобка, открывающая тело функции, пишется на новой строке.
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Типы добавил, оформление исправил, но что-то я не понял, почему вы сказали, что getMin(2, 2, 1) возвращает 2, у меня возвращает 1, если я вас правильно понял](https://php.zone/uploads/img/20210208904983d14487252b0562b629f34f417ff96e165a0cb2c33cb84fe441832ee9cd.PNG)
Артем, подскажи, пожалуйста, а как написать функцию, чтобы получить первые несколько слов из предложения?
Я использую такую конструкцию, чтобы получить первое слово:
Было: "мужская куртка синяя на замке"
Стало: "мужская"
reset получает первое слово. А если мне нужно два первых слова или три?
Проходи курс дальше, там будут циклы.
Имена функций пишутся в camelCase. У аргументов нужно указывать типы.
Отлично
Что с именем функции?)
Возвращает не то что нужно, перечитайте задание.
Скобка, открывающая тело функции, пишется на новой строке. Да и в целом с форматированием беда какая-то. Нужно сделать как в уроках с соблюдением отступов и переносов.
Ничего сложного в факториале нет. Просто загуглите что это такое.
Ок, спасибо поправил имя функции и отформатировал с помощью шторма, а в первой функции перепутал наименьшее с наибольшим.
Функция должна возвращать число а не строку.
getMinNumbers(1, 1, 2) выдает неправильный результат
Добрый вечер Артём, подскажи пожалуйста, как написать (решить правильно) рекурсивную функцию для палиндрома (если делать через функцию strrev - понятно, но, если делать рек
Немного подумав, такое решение
1я задача.
Вторая задача.
3я задача
4я задача
А вы как комментарий сюда добавили? Они же закрыты к этому уроку.
После домашнего задания тык по слову "Комментарии".
Понял, спасибо. В PHP фигурная скобка ставится на той же строке что и условие.
Спасибо за урок. Решения еще не смотрел, реализовал задания так:
С рекурсией сложновато, сам не осилил, помогал гугл)
P.S:
Первое задание переделал: