Чат Telegram
Группа ВКонтакте
Новый комментарий


omk

В 3 задаче про факториал. (произведение целых чисел от ЕДИНИЦЫ до переданного)

ivashkevich

Глаз-алмаз :)
Спасибо, исправил.

omk

Решение последней задачи:

<?php
function numbers(int $x) {
    if ($x == 0) {
        echo $x;
        return 0;
    }
    $y = numbers($x - 1);
    echo ', ' . $x;
    return $y;
}

numbers(5);
ivashkevich

Принято! Отличный вариант. Однако можно чуть упростить - как я говорил, функция может и вовсе ничего не возвращать. В итоге всё можно свести к следующему коду:

<?php
function numbers(int $x) {
    if ($x == 0) {
        echo $x;
        return;
    }
    numbers($x - 1);
    echo ', ' . $x;
}

numbers(5);

По поводу бонуса написал на почту. Так держать!

vadymbilyi@gmail.com

А если переданное значение будет отрицательное. Например -10, тогда данная функция не сработает)

prinzplanloser0514@gmail.com

Я понять не могу,почему у нас отсчет идёт при выводе с 0,мы же уменьшаем переменную $x,а не увеличиваем. Значит по идее должно быть 5,4,3,2,1,0

ivashkevich

Смотри следующий урок про отладку

prinzplanloser0514@gmail.com

Посмотрел,включил XDebug . Первое действие numbers(x-1);и почему там ответ $x:1 . По идее же должно быть 4, т.к $x=5 ($x-1)=(5-1)

ivashkevich

У меня на первом уровне погружения 5, потом 4, потом 3... Дохожу до нуля. Условие выполняется, вывожу 0. Поднимаюсь на уровень выше, следов для $x = 1 выполняется:

echo ', ' . $x;

Тут функция завершает свою работу. Возвращаюсь еще на уровень выше. там $x = 2.
Вывожу 2. И в итоге дохожу до 5. Вывожу его. Функция завершается. Возвращаюсь к месту, где она изначально была вызвана с параметром 5. Дальше кода нет. Работа скрипта завершается.

vadymbilyi@gmail.com

я сделал так. Учитывая что значение может быть также и отрицательное.

<?php
function integer0 (int $x)
 {
    if ($x == 0){
        return 0;
    }
    elseif ($x > 0){
        return integer0 ($x-1) . ' '. $x;
    }
    else {return $x . ' ' . integer0 ($x+1);}
 }

 $b = -25;
 echo integer0 ($b);
?>
ivashkevich

отличный вариант!

PHPStudent

Ребята, вы молодцы. Огромное Вам спасибо. Подскажите когда будет продолжение курса?

ivashkevich

Привет, спасибо!
На выходных появится новый урок, будет интересная тема =)

PHPStudent

Спасибо, жду с нетерпением! =)

PHPStudent

Не могу понять, а как программа в последней задаче пробегает от 0 до нужного значения.

ivashkevich

А на листочке уже пробовали пошагово разобрать?
Вот представьте:

  1. передали в функцию число 3
  2. сравнили с 0, условие выполнилось? Нет
  3. На следующей строке происходит вызов этой же функции, выполнение текущего вызова "останавливается" и ждёт пока выполнится следующий
  4. В функцию передалось число 2

Дойдите так до 0, и напишите, стало ли понятно.

PHPStudent

Извините но не понимаю. Если я устанавливаю первоначальное значение числа например 5 то почему стартует с 0?

ivashkevich

Потому что именно при нуле сработает первый echo. Затем мы выполним return и вернемся на уровень выше, где в функцию была передана единица. После вызова функции с передачей в неё нуля идет строка, которая выведет единицу. И так далее. Если сейчас нет понимания - ничего страшного. Тема рекурсии не сразу дается. Дождитесь следующего урока, там точно станет понятнее, обещаю =)

mik05bk@gmail.com

Я вот, что-то не понимаю. Почему в функцию передается 1, потом 2 и т.д.?

ivashkevich

Нет, в функцию передаётся как раз в обратном порядке: 5, 4, 3...
Посмотрите следующий урок про отладку приложений, должно стать понятнее. Там тоже будет рекурсия.

Andy

ТОже вопрос возник такой. Глаз замылился, потупил посидел. Спасибо, разъяснили!

Anril34
<?php
function minimumNumber(float $x, float $y, float $z)
{
    if ($x > $y)
    {
        $minimum = $y;
    } else {
        $minimum = $x;
    }
    if ($minimum > $z)
    {
        return $z;
    } else {
        return $minimum;
    }
}
$x = 9;
$y = 5.1;
$z = 99.3;
echo 'Минимальное число: ' . minimumNumber($x, $y, $z);
ivashkevich

Всё верно =)

humanidis@gmail.com

Какой код корректней использовать для решения этой задачи? Вышеуказанный или

<?php
    function getMin(float $x, float $y, float $z){
        if ($x < $y && $x < $z){
            return $x;
        }else if ($y < $z){
            return $y;
        }else{
            return $z;
        }
    }

    $a = 7;
    $b = 10;
    $c = 22;

    echo getMin($a, $b, $c);
?>
ivashkevich

Я бы выбрал Ваш вариант, но тот тоже вполне имеет право на существование. elseif пишется слитно.

Verbum

Catchable fatal error: Argument 1 passed to getMin() must be an instance of float, integer given, called

ivashkevich

используйте PHP7

spacepancake

Не могу понять как работает это выражение :( $x * power($x, $n - 1), т.е я понимаю, что под этим скрывается 2 * power(2, 2), но как происходит умножения двойки на функцию с двумя аргументами? Как двойка выбирает на какой аргумент умножать? Действительно мозги закипают!)

ivashkevich

Посмотрите следующий урок, должно стать понятнее :)

spacepancake

Благодарю! Кстати отличный курс, прошёл на одном дыхании. THUMBS UP

ivashkevich

Спасибо! Но это только треть, от того что я запланировал :)

spacepancake

Бамба!

phenomg

1)

function minimal($x, $y, $z) {
   if ($x > $y) {
     if($y > $z) { 
       return $z;
     }
     else return $y;
   }
   elseif ($x > $z) {
     return $z;
   }
   else {
     return $x;
   }
} 

$a = (float) 7.5;
$b = (float) 5.2;
$c = (float) 21.0;

echo "Минимальное число: " . minimal($a, $b, $c);
ivashkevich

А зачем вы сделали приведение к float при определении переменных? И нужно добавить приведение к типу в аргументах функции. А в целом - алгоритм верный.

phenomg

2)

function x2(&$x, &$y) {
    $x *= 2;
    $y *= 2;
} 

$a = 5;
$b = 20;

echo "Первое число: $a. Второе число: $b. <br/>";

x2($a, $b);

echo "Первое число после выполнения функции: $a. Второе число после выполнения функции: $b. <br/>";
ivashkevich

Всё хорошо, только добавьте типы для аргументов функции =)

kolesnikow_y@mail.ru
function getMin(float $x, float $y, float $z) {
    if(($z > $x)&&($x < $y)){//если min x
        return $x;
    } elseif(($z > $y)&&($y < $x)) {//если min y
        return $y;
    }
    return $z;
}
ivashkevich

Верно!

trialex3

ПО поводу последней задачи так и не разобрался. Вижу решение, но как это все работает вместе - хз. Будем думать.

vasyaproject

А я первую функцию с одной & писал - это неверно?

function minArg(float $x, float $y, float $z) 
{
    if ($x < $y & $x < $z){
        return $x;
    } elseif ($y < $x & $y < $z){
        return $y;
    } else {
        return $z;
    }
}
echo minArg(6.6, 4.9, 4.5);
ivashkevich

Конечно, неверно. Это совершенно другой оператор.

Tays

По поводу последнего задания. Почему уменьшаем на единицу, а выводится с увеличением?

function numS(int $a){
    if($a == 0){
        echo $a;
                echo '<br>';
                return 0;
    } 
        {
        $n = numS($a - 1);
                echo $a;
        echo '<br>';
        return $n;
} 
}
numS(7);
ivashkevich

А вы запустите код в отладчике, и всё поймёте =) Вы же смотрели урок про отладку с помощью XDebug?
P.S. код после блока if {...} не надо заключать в фигурные скобки. Это бессмысленно. Просто продолжайте писать функцию дальше без скобок.

WarLikeLaux

Первое задание
enter image description here

ivashkevich

Предпочтительнее - оформлять код с помощью markdown-разметки, вот так:
```
код
```

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

WarLikeLaux

Второе задание
enter image description here

ivashkevich

Конкатенация строк происходит с помощью точки:

echo $x . ' ' . $y . ' ' . $z;
WarLikeLaux

Да, точно, забыл, не привык еще) Спасибо!)

WarLikeLaux

Третье задание
enter image description here

ivashkevich

Тут всё хорошо.

bratko

Подскажи куда правильно вставить var_dump или что нужно сделать, чтоб увидеть как получилось 120 в данном коде:

function factorial($x)
{
    if ($x == 1 || $x == 0) {
        return 1;
    }
    return $x * factorial($x - 1);
}
echo factorial(5);

с помощью xDebug пробовал, но не увидел как получается 120

ivashkevich

Перед return-ами.

WarLikeLaux

Четвертое задание
enter image description here

ivashkevich

Тут тоже всё верно)

serb2017

Вариант для последнего задания. Выводит числа от m до n.

function Nature($m, $n)
{
    echo $m++, ',';
    if ($m == $n + 1) return;
    return Nature($m, $n);
}

$n = 10;
$m = 0;
Nature($m, $n);
ivashkevich

Конкатенация строк происходит с помощью точки:

echo $x . ' ' . $y . ' ' . $z;

Имена функций начинаются с маленькой буквы.

serb2017
function getMin3(float $x1, float $x2, float $x3)
{
    if ($x1 < $x2 && $x1 < $x3) {
        return $x1;
    }
    if ($x2 < $x3) {
        return $x2;
    }
    return $x3;
}

$x1 = 3.25;
$x2 = 3.2;
$x3 = 3.3;
echo "минимально число из   $x1, $x2, $x3 ". '<br>'. getMin3($x1, $x2, $x3);
ivashkevich

Верно! =)

Lungren
function getMinn($x, $y, $z)
{
    if ($x < $y) {
        return $x;
    } elseif ($y < $z) {
        return $y;
    } else {
        return $z;
    }
}

$a = 6;
$b = 3;
$c = 1;
echo 'Наименьшее число ' . getMinn($a, $b, $c);
ivashkevich

Ошибка. Если я передам числа 2, 3, 1, то вернется число 2.

1nSide

1 Задача

<?php

function getMin ($x, $y, $z) {
    if ($x < $y && $x < $z) {
        return $x;
    } elseif ($y < $x && $y < $z) {
        return $y;
    } else return  $z;
}

$a = 6;
$b = 10;
$c = 8;

echo 'Наименьшее число = ' . getMin($a, $b, $c);
ivashkevich

Всегда оформляйте код после if и else в блоки с помощью фигурных скобок.

else {
    ...
}
1nSide

2 Задача

<?php

function multiply2(&$x, &$y){
    $x = $x * 2;
    $y = $y * 2;
}

$a = 4;
$b = 10;

multiply2($a, $b);
echo 'Первое число умноженое на 2 = ' . $a;
echo '<br>';
echo 'Второе число умноженое на 2 = ' . $b;
ivashkevich

Тут всё гуд)

1nSide

3 Задача

<?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);
ivashkevich

У функции открывающая фигурная скобка находится на следующей строке. В остальном - норм.

1nSide

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);
ivashkevich

Спасибо, учту) По поводу двух раз - это до вас ещё быстро дошло.
Что касается задачи - привыкайте использовать типы для аргументов функций.

function getSumOfNumbersFromZero(int $nmin, int $nmax)

Будет плюсом при трудоустройстве, если вы будете знать возможности PHP7.

1nSide

Думал что язык сам подбирает тип переменных поэтому не считал нужным писать их в аргумент функции)

ivashkevich

Он их не подбирает. Если их не указать, то они придут как есть. Это плохо, когда в аргументах может прийти что угодно. Это приводит к большему числу ошибок.

hkam11

Добрый день. Подскажите, пожалуйста, при рекурсии получается, что функция преобразует запись 2^3 в 2x2^2, а потом в 2x2x2^1?

ivashkevich

Добрый. Да, вроде того. Посмотрите видео в следующем уроке, после него точно поймёте.

hkam11

Задание №4.

<?php
function getNumbers (int $n) {
    if ($n==0) {
        return $n;

    } else {
        echo $n, ' ';
        return getNumbers($n-1);
    }
}
echo getNumbers(6);

Не могу понять, как сделать, чтобы отсчет начинался с 0, а не с заданного числа

ivashkevich

Подсмотрите в других комментариях, не страшно :)

FantaZ

По поводу последней задачи - не уверен, но мне кажется самый лаконичный вариант:

<?php
declare(strict_types=1);

function numbers(int $num) {
    if ($num > 0) {
        numbers($num - 1);
    }

    echo $num;
    return;
}

numbers(5);
ivashkevich

Отлично! Но return в конце не имеет смысла. Уберите, пока никто не увидел =)

vityan97@gmail.com
<?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);
ivashkevich

Отлично! Из замечаний:

  1. не нужно в функции делать вывод чего-либо, она должна только вернуть число.
  2. всё хорошо, но return на последней строке функции необязателен, достаточно просто вызывать её, ничего не возвращая.
nemo.dont@gmail.com

C последней функцией повышенной сложности не справилась (( Рассмотрела, как решили другие, все вроде бы понятно, но вот сама не дошла до этого, увы.
Фун №1

<?php
function minNumFrom (float $a, float $b, float $c)
{ if ($a<$b && $a<$c)
   {return $a;}

   elseif ($b<$a && $b<$c)
   {return $b;}

    return $c;
}

$a=25.7;
$b=808.1;
$c=10.8;

    echo 'Минимальное число ' . minNumFrom ($a,$b,$c);
?>

Фун №2

<?php
function multi2(int &$x, int &$y)
{
    $x = $x * 2;
    $y = $y * 2;
}

$a = 9;
$b=467;

multi2($a, $b);

echo 'Первое число, умноженное на 2 равно ' . $a . '<br> ' . ' Второе число, умноженное на 2 равно ' . $b;

?>

Фун №3

<?php

function fac($a)
{
    if ($a>2)
    {return  $a * fac($a-1);}

    return $a;

}

$a=3;

echo 'Факториал числа ' . $a . ' равен ' . fac($a);

?>
ivashkevich

Отлично!

Fox-24

Добрый день.

Начиная с PHP 5.3.0, вы можете получить предупреждение о том, что передача переменной по ссылке устарела, если используете & в foo(&$a);. Начиная с PHP 5.4.0 передача переменной по ссылке стала невозможна, поэтому использование этого приема приведет к фатальной ошибке.

ivashkevich

Добрый день, это про то, что нельзя при вызове функции передавать ссылку:

$x = func(&$y);

Но при определении функции это можно делать:

function func (&$x)
{
    ...
}
Fox-24

Благодарю за урок!

<?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);
ivashkevich
function funInter($a)
{

    if ($a >= 0) {
        funInter($a - 1); // Уменьшаем заданное число на единицу
        echo $a . '</br>';   // И выводим каждое новое число из предыдущей операции с новой строки

    } else {
        return;
    }
}

Изменится ли что-то, если убрать вот этот кусок:

    else {
        return;
    }
Fox-24

ничего не изменится)

ivashkevich

Правильно, значит этот кусок кода убираем, и код становится проще :)

ivashkevich

Не забывайте указывать типы у аргументов функций!

Fox-24

Да, спасибо, я их специально не указываю т.к.:

Scalar type hints are available in PHP 7

А у меня в проекте 5.4.

Но я это учитываю.

ivashkevich

Советую Вам всё же перейти на версию 7, 5.4 - старенькая. На работе будут требовать 7, и будет круто, если Вы уже её использовали.

Fox-24

Да, я конечно же перейду, у меня просто есть проект в котором сейчас 5.4 и пока удобнее оставаться на ней. Но преимущества 7-ки я оценил.

honor
function lowSum(float $a, float $b, float $c){
                        if ($a > $b){
                            return $a;
                        }elseif($a > $c){
                            return $a;
                        }elseif($b > $a){
                            return $b;
                        }else{
                            return $c;
                        }
                    }
                    echo 'наибольшее число'.lowSum(7.2, 6.1, 2.3);
ivashkevich

Это к какому заданию домашка?

AxLT

Первое:

function getMin(float $x, float $y, float $z){
    if ($x < $y){
        if ($x < $z){
            return $x;
        }
    }
    elseif($y < $z){
        return $y;
    }
    return $z;
}
echo 'Наименьшее число float из трех: ' . getMin(1.3, 2.1, 3.2)

Второе:

function doubleSomeNumber(int &$x, int &$y){
    $x *= 2;
    $y *= 2;
    return;
}
$x = 5;
$y = 3;
echo doubleSomeNumber($x,$y);

Третье

//Факториал числа
function factorialOfNumber(int $n){    
    if ($n == 1){
        return $n;
    }
    return $n * factorialOfNumber($n-1);
}
echo factorialOfNumber(3)

Все ли верно или что то лучше написать иначе?
4 глянул в комментах, не очень понятно почему выводит на экран с нуля а не наоборот =)

ivashkevich

Всё норм, но непонятно зачем во втором вы возвращаете строку из двух склеенных чисел. По поводу четвертого - переходите к следующему уроку, будет понятнее.

AxLT

Подправил чуток второе. Да с отладкой, четвертое стало понятнее, но еще надо с рекурсией разбираться

<?php

function doubleSomeNumber(int &$inputNumFirst, int &$inputNumSec)
{
    $inputNumFirst *= 2;
    $inputNumSec *= 2;
}

$someNumFirst = 5;
$someNumSec = 3;
doubleSomeNumber($someNumFirst,$someNumSec);
echo 'Первое произведение равно: ' . $someNumFirst . '<br>Второе произведение равно: ' . $someNumSec;
ivashkevich

Окей, ничего страшного, рекурсия многим непонятна на первых порах.

ArtemijeKA

1:

function smallOfThreeArg(float $a, float $b, float $c)
{
    if ($a < $b) {
        if ($a < $c) {
            return $a;
        }
        return $c;
    }
    return $b;
}
echo smallOfThreeArg(5.2, 8.6, 3.6);

2:

$a = 4;
$b = 3;
function twoArgMultiplyBy2(&$a, &$b)
{
    $a = $a * 2;
    $b = $b * 2;
}
twoArgMultiplyBy2($a, $b);
var_dump($a, $b);

3:

function factorialBy1ToArg($arg) // 4 3 2 1 0
{
    if ($arg >= 1) {
        return $arg + factorialBy1ToArg($arg - 1); // 5 6 10
    }
}
echo factorialBy1ToArg(4); // 10

4.0:

Здесь обошелся без рекурсии и более понятно.

function echoNumberBy0ToArg_v1($arg)
{
    for ($i = 0; $arg >= $i; $i++) {
        echo $i . '<br />';
    }
}
echoNumberBy0ToArg_v1(2);

4.1:

Здесь не поянтно почему cперва 0, а не 1 ведь arg-(arg-1)=1?

function echoNumberBy0ToArg_v2($arg) // 2
{
    if ($arg >= 0) { // 2
        echo $arg - echoNumberBy0ToArg_v2($arg - 1) . '<br />'; // 0 1 2 
    }
}
echoNumberBy0ToArg_v2(2);
ivashkevich

Нужно указывать return-type для функции, через двоеточие, как в уроке.

3 - а где обработка случая, когда не больше единицы? Вам повезло, что null преобразовался в 0. Факториал - это произведение а не сумма.

4 - в именах функций в современном PHP не используются подчеркухи. Потому что выражение сначала вычисляется, а затем выводится. Самым первым будет вычислено выражение для нуля, оно же и выведется первым.

ArtemijeKA

Благодарю за замечания!
3. Так будет корректно? Или не очень?

function factorialBy1ToArg($arg) // 4 3 2 6 24 120
{
    if ($arg >= 1) {
        if ($arg > 2) { // 4 3 2
            $arg *= factorialBy1ToArg($arg - 1); // 12 6
        }
        return $arg; // 2 6 24 120
    } else {
        echo 'Нельзя вычислить факториал от числа меньше 1-ого';
    }
}
echo factorialBy1ToArg(5); // 120
ivashkevich

Привет, не очень, потому что:

  1. факториал нуля равен единице
  2. где работа над замечаниями, что я писал выше? Где типы аргументов, где тип возвращаемого значения?
  3. что за название? Почему не просто factorial? =)
Benya

3 задание

function fact(int $x)
{
    if ($x == 1) {
        return $x;
    }
    return $x * fact($x-1);
}

echo "rezult---" . fact(5);
ivashkevich

Отлично =)

ilyaOrlov

Верно ли выполнение третьего задания?

function Factorial (int $a)
{
    if ($a == 0) {
        return $a + 1;
    } elseif ($a == 1) {
        return $a;
    }
    return $a * getFactorial ($a - 1);
}

echo getFactorial (6);
ivashkevich

ну не работает же, ёлки-палки - функция называется 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);
}
dsokol-ok

Спасибо за урок!

function getIntFromZero ($a)
{
   if ($a >= 0) {
       if ($a == 0) {
           echo $a . '<br>';
           return;
       }
       echo $a . '<br>' . getIntFromZero($a - 1);
       return;
   }
   echo 'Введите неотрицательное число!<br>';
}
$a = 47;
getIntFromZero($a);
ivashkevich

Хорошо!

mangol1167
function getMin(float $a, float $b, float $c) //1ое задание
{
if ($a < $b && $a < $c) {
return $a;
} elseif ($b < $c) {
return $b;
} else {
return $c;
}
}
$x = 10;
$y = 8;
$z = -9;
echo 'Минимальное число ' . getMin($x, $y, $z); 

//2ое задание
function getMultiplication (&$x, &$y)
{
$x = $x * 2;
$y = $y * 2;
}
$a = 10;
$b = 4;
getMultiplication($a,$b);
echo $a . '<br>';
echo $b . '<br>';

В рекурсии не разобрался (отчасти понял), но комменты почитал и попробовал код других ребят копировать и разобрать. Буду дальше учить... разберусь)

ivashkevich

Отличная домашка! Но можно еще добавить return-значения для функций (после двоеточия).

mangol1167

Спасибо, это со временем наверное придет)

ivashkevich

Да, конечно)

Serhio
<?php

    function minNumber(float $x, float $y, float $z)
    {
        function minValue($x, $y)
        {
            return $x < $y ? $x : $y;
        }

        return minValue(minValue($x, $y), $z);
    }

    echo minNumber(88.1, 99.6, 6.7);

Задача 1: нахождение минимального числа.

ivashkevich

Норм)

7vs13@inbox.ru
function printOfNumbers($b){
    if($b == 0){
         echo $b;
    }
    else {
        printOfNumbers($b-1);
        echo $b;
    }
}
printOfNumbers(9);

Вообще без "return" сделал. Возможно, в моем случае как-то по-другому вывод происходит, нежели в вашем примере, но все работает.

ivashkevich

echo - выводит, return - возвращает. То есть потом значение, которое функция вернула, можно использовать. Например, вот так:

$x = getNumbers();
$y = $x / 2;
echo $x;
echo $y;
virtual2018
<?php
function maxNumber(float $a, float $b, float $c)
{
 $maxNumber = $a;
 if ($maxNumber < $b) $maxNumber = $b;
 if ($maxNumber < $c) $maxNumber = $c;

 return $maxNumber;
}

$a = 3.1;
$b = 15.3;
$c = 11.1;
echo "Исходные числа a = $a b = $b c = $c".'<br>';
echo "Максимальное из трех чисел ".maxNumber($a,$b,$c).'<br><br>';

function multiplication_2(&$x,&$y)
{
    $x *=2;
    $y *=2;
}

$x = 5;
$y = 10;

echo "Исходные числа x = $x y = $y <br>";
multiplication_2($x,$y);
echo 'Числа умноженные на 2: <br>'.$x." ".$y;

function factorial(int $x)
{
    if ($x == 1) return $x;
    else $x *= factorial($x - 1);

    return $x;
}

$x = 4;

echo "<br><br>Число x=$x, его факториал = ".factorial($x);

function printNumbers(int $x) {
    if ($x == 0) {
        echo '<br><br>Список значений числа<br>';
        echo $x;
        return;
    }
    printNumbers($x - 1);
    echo ', ' . $x;
}

printNumbers(7);

Исходные числа 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

ivashkevich
  1. Всегда после if ставьте фигурные скобки. Сэкономите в дальнейшем много времени и нервов.
  2. Открывающая скобка тела функции { всегда на новой строке
  3. Имена функций пишутся camelCase-ом. multiplication_2 - некорректное имя.

По логике - всё отлично.

lig7771991@list.ru

Последняя задача без рекурсии

<?php

function list1($x)
{
    $str = '';
    for (;$x>=0;$x--) {
        echo $x.'<br>';
    }
    return  $str;
}
echo list1(10);
ivashkevich

Для чего здесь переменная str? Зачем в конце что-то возвращать и выводить результат функции, если она внутри своего тела выводит нужные данные.
Почему не указали типы аргументов? Где тип возвращаемого значения?
И почему не сделали как написано в задании, через рекурсию?

Waldemar

Немного застрял поначалу в первой задаче по минимуму из трёх значений.
Посмотрел следующий урок по Xdebug, вернулся и для большего понимания сделал такой код:

<?php
$a = 11; $b = 23; $c = 5;

$min1 = $a < $b ? $a : $b;
$min2 = $min1 < $c ? $min1 : $c;

echo $min2;

На выходе получается меньшее из трёх. Ух, спасибо, Артём, такие уроки мощно прочищают мозги, заставляют заново крутиться заржавевшие механизмы. Осталось запомнить слово "тернарный"))

ivashkevich

Хах) На здоровье! Успехов в дальнейшем обучении!

Pavel-Tonk

Так решил задачку с наименьшим числом(необычненько). вопрос есть ли у PHP массив arguments как в js?

function getMinNum(float $x, float $y, float $z) {
    $arr[] = $x;
    $arr[] = $y;
    $arr[] = $z;
    sort($arr);
    return $arr[0];
}
echo getMinNum(2.5,1,26);

Мое решение факториала.

function getFactorialNum($x) {
    return $x === 1 ? 1 : $x * getMinNum($x-1);
}
echo getFactorialNum(5);

Так получилось без рекурсии последнюю задачу решить

function getAllNum(int $x) {
    for ($i = 0; $i <= $x; $i++) {
        echo $i.' ';
    }
}
getAllNum(5);

Так додумался с рекурсией

function recFunc($z, $y = 0) {
    echo $y.' ';
    return $y === $z ? $z : recFunc($z, $y + 1);
}
recFunc(8);

Может быть мое решения кому-то пригодятся или помогут=)

ivashkevich

По решениям - всё ок. По вопросу - функция func_get_args(). Но еще можно вот так:

function func(...$array) {
Pavel-Tonk

Спасибо, буду читать матчасть!=)

Bogdan

а то что после последнего символа в выводе у него пробел, это ок?

ivashkevich

Допустимо. Но будет лучше без него.

Bogdan

Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.

function minOfThreeFloats(float $a, float $b, float $c)
{
    if ($a == $b || $a == $c || $b == $c) {
        echo "в переменных присутствуют одинаковые значения<br>";
        return;
    }
    if ($a <= $b && $a < $c) {
        echo "Первый аргумент меньше<br>";
        return $a;
    } else if ($b < $a || $b < $c) {
        echo "Второй аргумент меньше<br>";
        return $b;
    }
    echo "Третий аргумент меньше<br>";
    return $c;
}

Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.

function multiplAllArgumOn2(&$a, &$b)
{
    $a *= 2;
    $b *= 2;
}

Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)

function factorial($a)
{
    if ($a == 1) {
        return $a;
    }
    return $a * factorial($a - 1);
}

Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения. И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности. Кто справится и первым напишет верное решение в комментах – тот красавчик и получит от проекта небольшой бонус. UPD: первым справился человек с ником omk. Вариант его решения вы можете увидеть в комментариях.

function echoInteger(int $a) {
    if ($a == 0) {
        echo "0";
        return;
        }
    echo ", " .$a . echoInteger($a - 1);
    }
ivashkevich
  1. Функция всегда должна возвращать минимальное значение и не должна ничего выводить. Если все значения равны, значит минимальное значение - это значение любого из этих чисел.
  2. Всё супер
  3. Тоже отлично
  4. Супер!
polvanovv

Здравствуйте! Подскажите почему не работает вариант с декрементом в функции факториала?
рабочий вариант:

function factorialOfNumNew( int $n)
{
    if ($n == 1) {
        return $n;
}
        return $n * factorialOfNumNew($n - 1);
}
$num = 5;
echo factorialOfNumNew($num);

Такой вариант выдает ошибку:

return $n * factorialOfNumNew($n--);
ivashkevich

Прочитайте про постинкремент и преинкремент.

polvanovv

Если использовать предекремент результат неверный.

ivashkevich

Потому что он в выражении выполняется раньше всего остального. Он уменьшает n ещё до того как оно умножается на правую часть выражения. Для того чтобы это понять нужно изучить приоритеты операторов в PHP.

polvanovv

Спасибо за ответы!

polvanovv

Еще можно библиотеку GMP подключить и использовать её фунцию)

function factorialOfNum(int $x)
{
    return gmp_fact($x);

}

$y = 4;
echo factorialOfNum($y);
XXX

Решение

XXX
<?php
function minFloat (float $x, float $y, float $z)
{
    if($x<$y and $x<$Z){
        return $x;
    }
    elseif($y<$x and $y<$z){
        return $y;
    }
    elseif($z<$x and $z<$y) {
        return $z;
    }
}
$x=10;
$y=6;
$z=2;
echo minFloat($x,$y,$z).'<br>';

function mult2(&$e,&$r){
    $e=$e*2;
    $r=$r*2;
}
$e=4;
$r=3;
mult2($e,$r);
echo $e.' '.$r.'<br>';

function factorial($x)
{

    if($x==1)
        return 1;
    return $x*factorial($x-1);
}
echo factorial(0);
ivashkevich

Хорошо. Тип аргумента для факториала тоже бы добавить. И прочитай про типы возвращаемых значений ещё.

SashkoUkraine
<?php
1) function getMinNumber(float $num1, float $num2) {
    echo min($num1, $num2);
}

getMinNumber(42.9, 24.2);

2) function getMultiplyNumber(&$num1, &$num2) {
    echo $num1 = 2 * $num1;
    echo "<br>";
    echo $num2 = 2 * num2;

}

$a = 24;
$b = 123;

getMultiplyNumber($a, $b);
ivashkevich
  1. Функция должна принимать на вход 3 аргумента. Она должна возвращать значение, а не выводить.
  2. Функция должна только изменить значения по ссылкам, она не должна ничего выводить. Вывод переменных стоит сделать после вызова функции.
SashkoUkraine
function getMinNumber(float $num1, float $num2, float $num3) {
    return min($num1, $num2, $num3);
}

getMinNumber(42.9, 24.2, 59.7)

function getMultiplyNumber(&$num1, &$num2) {
    $num1 = 2 * $num1;
    $num2 = 2 * num2;

}

$a = 24;
$b = 123;

getMultiplyNumber($a, $b);

echo $a;
echo "<br>";
echo $b;
ivashkevich

Отлично!

fapchat2@gmail.com
<?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 и т.д.?

ivashkevich

Запустите этот код и получите этот же вывод. Для того, чтобы его понять, нужно понять как работает рекурсия. Следующий урок - в помощь =)

excent63

Первое задание понял вот так:

<?php

function minFloat(float $x, float $y, float $s){
    if ($x < $y && $x < $s){
        return $x;
    }elseif ($x > $y){
        return $y;
    }else {
        return $s;
    }
}
echo minFloat(8.4,9.6,10.7);
ivashkevich
echo minFloat(5, 4, 3); // вернет 4, должно быть 3
excent63

Спасибо! сейчас вроде сработало)

<?php
function minFloat(float $x, float $y, float $s){
    if ($x < $y && $x < $s){
        return $x;
    }elseif ($y < $s){
        return $y;
    }else {
        return $s;
    }
}
echo minFloat(11.4,9.6,7.7);
ivashkevich

Теперь норм!

excent63

Вот так понял 2 задание:

<?php
function twoLink (&$x, &$y){
    $x *= 2;
    $y *= 2;
}
$a = 10;
$b = 5;
twoLink($a,$b);
echo $a.'<br>'.$b;
//Результат 20 и 10
ivashkevich

Верно

Pro100Bah
echo 'Работа с функциями' . '<br>';
//Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.
function threeNumbers(float $x, float $y, float $a)
{
    var_dump($x, $y, $a);
    if ($x < $y) {
        return $min = $x;
    } else {
        return $min = $y;
    }
    if ($min < $a) {
        return $min;
    } else {
        return $a;
    }

}

$x = 1.05;
$y = 4.18;
$a = 2.14;

echo '<br>' . 'Минимальное значение: ' . threeNumbers($x, $y, $a);
echo '<hr>';
//Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.
function twoNumbers(&$x, &$y)
{
    var_dump($x, $y);
    $x = $x * 2;
    $y = $y * 2;
}

$a = 25;
$b = 50;
twoNumbers($a, $b);

echo '<br>' . 'Результат 1-ое число: ' . $a . '<br>' . 'Результат 2-ое число: ' . $b;
echo '<hr>';
//Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного).
function factorial(int $x)
{
    var_dump($x);
    if ($x == 1) {
        return $x;
    }
    return $x * factorial($x - 1);
}

$x = 10;
echo '<br>' . 'Результат вычисления n!: ' . factorial($x);
Последнее задание что-то не получилось сделать, просмотрел комментарии, поэтому не стал писать код
ivashkevich
  1. Если передам 3, 5, 1 то вернет 3, должно быть 1. Вот этот код ерунда полная:
    return $min = $x;

    разбирайтесь что такое return и как работает присваивание.

  2. ОК
  3. ОК

var_dump-ов в рабочих функциях быть не должно.

Pro100Bah
//Напишите функцию, которая будет принимать на вход 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. Сначала мы объявляем переменную(новую), если мы присваиваем ей наши аргументы в функции; потом совершаем уже действия и только в конце выводим результат.

ivashkevich
return $min = $x;

Этот код отработает так: сначала в $min присвоим $x, затем вернем $min. Получается, просто так присваивали, хотя могли бы сразу вернуть $x.

Теперь все ок.

fapchat2@gmail.com
<?php

function multiplie(float &$b,float  &$x )
{
    return $b= $b*2;
    return $x= $x*2;
}
$n=5;
$q=78;
multiplie($n,$q  );
echo $n . '<br>', $q;

Второе число не умножается на 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.
ivashkevich

return завершает работу функции и возвращает то, что справа от него.

volodia.pavloff201343@gmail.com

Я очень сильно усложнил,но результата добился)

function minBox($a){
  if ($a%2 == 0 && $a > 1){
    return $a;
  }
  return minBox($a - 1);
 }

 $x = 21;
 echo "Предложеное число: " . $x . "<br>";
 while ($x > 1) {
   echo minBox($x) . "<br>";
   $x = minBox($x) - 1;
 }
ivashkevich

Привет) Это что за алгоритм вообще?)

volodia.pavloff201343@gmail.com

Решение 4 задачи)

ivashkevich

Очень сложно. Рекомендую ознакомиться с другими решениями в комментариях.

rashik-2009@yandex.ru

Скорректировал, теперь выводятся именно числовое значение

<?php

function minNumber(float $x, float $y, float $z) {
  if ($x < $y) {
     if ($x < $z) {
    return $x . ' минимальное значение';
 }
 }   elseif ($y < $z) {
    return $y . ' минимальное значение';
 }
     else {
    return $z . ' минимальное значение'; 
}

}

$a = 4.2;
$b = 3.6;
$c = 5.1;

echo minNumber($a, $b, $c);

?>
ivashkevich

Функция должна возвращать минимальное из переданных чисел. Где типы аргументов?

rashik-2009@yandex.ru

Правильно ли я понимаю, что возвращать, это означает, выводит на экран в браузере? В скорректированной версии кода, на экран выводится именно числовое значение "$y . ' минимальное значение'".
Типы аргументов указал function minNumber(float $x, float $y, float $z)

ivashkevich

Возврат производится с помощью return.

ABC

Немного не понял, в этом примере мы создали функцию getSum, у неё в качестве аргументов две переменные, $x и $y, с этим ясно, вот только не пойму, если функция возвращает сумму этих переменных, каким боком она же потом и возвращает сумму переменных $a и $b? Или тут подразумевается, что переменные $a и $b выступают в качестве значений переменных $x и $y?:

<?php

function getSum($x, $y)
{
    return $x + $y;
}

$a = 5;
$b = 10;

echo getSum($a, $b) . '<br>';
echo getSum(-3, 4);
ivashkevich

Перечитайте урок. В одном случае это аргументы функции, доступные только внутри функции. В другом - переменные, о которых функции ничего не известно. Почитайте в официальной документации об области видимости в PHP.

ABC

Спасибо за ваш ответ, и я бы наверное его понял, если бы код был таким:

<?php

function getSum($a, $b)
{
    return $a + $b;
}

$a = 5;
$b = 10;

echo getSum($a, $b) . '<br>';
echo getSum(-3, 4);

это к вопросу об области видимости итд.
Вы мой вопрос просто не поняли. Я просто хотел уточнить, что, если мы функцию написали, и её аргументы, к примеру, в общем виде, две переменные $x и $y, то мы потом можем эту функцию многократно использовать, подставляя вместо аргументов любые другие значения и она будет работать или как? То есть, как я это понимаю, поправьте если не прав, имеем функцию:

function getSum($x, $y)
{
    return $x + $y;
}

при вызове функции мы ей передаём значения для её аргументов (не важно, статикой или по ссылкам, не суть, сейчас главное понять смысл), эти значения заменяют значения аргументов в изначальном коде функции и они же подставляются в какой-то исполняемый код в её теле, так?

ivashkevich

Да, передавать разные аргументы вы можете сколько угодно раз. Имена переменных внутри функции никак не связаны с именами переменных за её пределами. Они могут быть как одинаковыми, так и разными по имени.

ashfedor
//дом задание
function argumentFloat(float $x, float $y, float $z)
{
if($x > $y)
{
    $min = $y;
}else{
    $min = $x;
}
if($min > $z){
    return $z;
}
else{
    return $min;
}
}
$a = 5.5;
$b = 5.58;
$c = 0.89;
 echo 'Выводим минимальное' . argumentFloat($a, $b, $c);
echo '<br>';
//  вторая функция
function multiplier2(&$x, &$y)
{
  $x = $x * 2;
  $y = $y * 2;
}
$a = 56;
$b = 76;
multiplier2($a, $b);
echo $a . '<br>' . $b;
echo '<br>';
//третья функция факториал числа
function factorialX($x)
{
    if($x == 1){
        return $x;
    }
    return $x + factorialX($x - 1);
}
 $x = 10;
echo factorialX($x);
echo '<br>';
//четверое задание
function integerNum(int $x)
{
    if($x == 0){
        echo $x;
        return 0;
    }
    integerNum($x-1);
    echo ', ' . $x;
}

integerNum(10);

Последнее подсмотрел

ivashkevich

Отлично

Nick

"Использовать функцию можно только после кода её определения!"
Разве нельзя сначала ее использовать, а потом объявить? Просто так тоже работает, и вроде как программа при компиляции проходит по коду два раза, первый раз для поиска переменных и функций, а второй раз уже исполняет программу.

Nick
function minNumber(float $a, float $b, float $c) {
  $min = $a < $b? $a : $b;
  $min = $min < $c? $min : $c;
  return $min;
}

echo minNumber(8.14, .8, .45) . '<br>' . '<br>';

function double(&$x, &$y) {
  $x *= 2;
  $y *= 2;
}

$x = 7;
$y = 3;
echo "$x $y<br>";
double($x, $y);
echo "$x $y<br><br>";

function factorialNumber($n) {
  if ($n == 1)
    return 1;

  return $n + factorialNumber($n - 1);
}

echo factorialNumber(4) . '<br>' . '<br>';

function factorialNumberEcho(int $n) {
  if ($n != 0) {
    factorialNumberEcho($n - 1);
    echo ', ';
  }

  echo $n;
}

echo factorialNumberEcho(4);
ivashkevich

Почему нет типов у аргументов?

Nick

Лень большая сила...

lilit

Первое:

<?php

function getMin(float $x, float $y, float $z)
{
    if ($x < $y && $x < $z) {
        return $x;
    }
    if ($y < $x && $y < $z) {
        return $y;
    }
    return $z;
}

$a = 10.6;
$b = 0.6;
$c = 7.5;

echo 'Наименьшее число: ' . getMin($a, $b, $c);

Второе:

<?php

function multiply2(&$x, &$y)
{
    $x = $x*2;
    $y = $y*2;
}

$a = 3;
$b = 2;

multiply2($a, $b);

echo $a, $b;

Третье:

<?php

function getSumOfNumbersFromOne(int $n)
{
    if ($n == 1) {
        return 1;
    }

    return $n * getSumOfNumbersFromOne($n - 1);
}

echo 'Результат: ' . getSumOfNumbersFromOne(4);

Четвертое:

ivashkevich
  1. С вот такими числами:
    $a = 0.6;
    $b = 0.6;
    $c = 7.5;

    Выдает: Наименьшее число: 7.5
    Что неправильно.

  2. ОК
  3. ОК
lilit

Вот так тогда, да?

<?php

function getMin(float $x, float $y, float $z)
{
    if ($x <= $y && $x <= $z) {
        return $x;
    }
    if ($y <= $x && $y <= $z) {
        return $y;
    }
    return $z;
}

$a = 0.3;
$b = 0.3;
$c = 7.5;

echo 'Наименьшее число: ' . getMin($a, $b, $c);
ivashkevich

Похоже на правду)

lilit

Четвертое:

<?php
function integer(int $a) {
    if ($a == 0) {
        echo 0;
        return;
    }
    integer($a - 1);
    echo ', ' . $a;
    return;
}

integer(10);
ivashkevich

Отлично!

babls2332@gmail.com
<?php

function minFloat(float $a, float $b, float $c)
{
    if (($a < $b) && ($a < $c))
        return $a;
    if (($b < $a) && ($b < $c))
        return $b;
    else
        return $c;
}

echo 'Минимальное число: ' . minFloat(12.5, 0.24, 0.25) . '<br>';

function multiplication(float &$a, float &$b)
{
    $a *= 2;
    $b *= 2;
}

$a = 5;
$b = 12;
multiplication($a, $b);
echo $a . '<br>';
echo $b . '<br>';

function factorial(int $a)
{
    if ($a === 0)
        return 1;

    else return ($a * factorial($a - 1));

}

echo 'Факториал 10: ' . factorial(10);
ivashkevich
  1. Все что после if и else берется в фигурные скобки.
    Последний блок else не нужен - просто выполнится в конце, если первые два условия не выполнились.
    При входных параметрах
    minFloat(0.24, 0.24, 0.25)

    говорит, что минимальное 0.25 - неправильно

  2. ОК
  3. Все что после if и else берется в фигурные скобки. Где уже нахватались кода без них?
babls2332@gmail.com

Читал, что если идёт одна строка, то можно не ставить скобки. Мол, код так не перегружен скобками

ivashkevich

Нужно всегда писать. Это сейчас стандарт в PHP. Скорее всего читали в устаревшем источнике.

babls2332@gmail.com

Подправил

<?php

function minFloat(float $a, float $b, float $c)
{
    if (($a <= $b) && ($a <= $c)) {
        return $a;
    }
    if (($b <= $a) && ($b <= $c)) {
        return $b;
    }
    return $c;
}

echo 'Минимальное число: ' . minFloat(0.24, 0.24, 0.25)
    . '<br>';

function multiplication(float &$a, float &$b)
{
    $a *= 2;
    $b *= 2;
}

$a = 5;
$b = 12;
multiplication($a, $b);
echo $a . '<br>';
echo $b . '<br>';

function factorial(int $a)
{
    if ($a === 0) {
        return 1;
    } else {
        return ($a * factorial($a - 1));
    }
}
echo 'Факториал 10: ' . factorial(10);
ivashkevich

Отлично!

Grewi

Функция - минимальное число с плавующей точкой

function getMin(float $a, float $b, float $c)
{
    if ($a < $b) {
        $min = $a;
    } else {
        $min = $b;
    }
    if ($min < $c) {
        return $min;
    } else {
        return $c;
    }
}

$a = 12.5;
$b = 6.2;
$c = 10.3;

echo 'Наименьшее число ' . getMin($a, $b, $c);

Функция - умножение по ссылке

function plNam(int &$a, int &$b)
{
     $a *= 2;
     $b *= 2;
}

$a = 3;
$b = 5;
plNam($a, $b);
echo 'Результат - '.$a.' и '.$b;

Третье задание

function factX(int $a)
{
    if ($a == 1){
        return $a;
    } else {
        return $a * factX($a - 1);
    }
}

$a = 12;
echo 'Решение '.$a.' будет равено: '.factX($a);

Функция - вывод чисел от нуля до заданного

$a = 100;
function inNam(int $a)
{
    if ($a == 0){
        echo $a;
    } else {
        inNam ($a - 1);
        echo ', '.$a;
    }
}

inNam($a);
ivashkevich

Вторая функция должна умножать аргументы на 2.
Факториал - это произведение чисел, а не сумма.

Grewi

:) Исправил

ivashkevich

Вторую функцию не исправили. И забыли про аргументы функций - где их типы?

Grewi

Так?

ivashkevich

Теперь так)

p4elka
function findMin3(float $x, float $y, float $z)
{
    if ($x <= 0.5*($y+$z) ){
           return $x;
    } elseif ($y <= $z){
       return $y;
    } else {
    return $z;
    }
}

echo 'myMin3=', findMin3(1.25, -56.43, 0)  , '<br>';

function multiplyBy2(float &$x, float &$y)
{
    $x= 2*$x;
    $y= 2*$y;
    return [$x, $y];
}

$x=0.48;
$y=-5.4;
echo 'x=', $x, '<br>';
[$a, $b]=multiplyBy2($x, $y);
echo 'myMult2=[', $a ,',', $b,']','<br>';
echo 'x=', $x, '<br>';

function myFactorial(int $x, int $y)
{

    if($x==1){  
       return $y;
    }
    $y = $y*$x;     
    return myFactorial($x-1, $y) ;
}

echo '4!=', myFactorial(4,1),  '<br>';

function myCount(int $x, int $i)
{
    if ($i<=$x){
       echo $i, ' ';
       return myCount($x,$i+1);
    }
}

myCount(5.7,1);

исправила факториал - посмотрела в комментах, как избавиться от дополнительной переменной. Теперь выглядит так:

function myFactorial(int $x)
{

    if($x==1){  
       return $x;
    }       
    return $x*myFactorial($x-1) ;
}

echo '5!=', myFactorial(5),  '<br>';

Давно это было, я всё подзабыла...

ivashkevich
  1. Неправильно работает, если передать 1, 0, 2 - вернёт 1. Не нужно придумывать математические формулы, используйте простое сравнение.
  2. Значения, переданные по ссылке и измененные внутри функции, возвращать не нужно.
  3. Исправленная функция для вычисления факториала - ОК.
s-kiryak@meta.ua

В который раз спасибо за уроки! Прошу проверить код:

// Функция принимает три аргумента и возвращает наименьший
function minValue(float $x, float $y, float $z) 
{
    if ($x <= $y) {
    if ($x <= $z)
        return $x;
    } elseif ($y <= $z) {
      return $y;
    } elseif ($z <= $y) {
      return $z;
    }
}

echo 'Минимальное значение: ' . minValue(2, 1.34, 1.33);

// Задание №2
function getMultiply2(&$x, &$y) 
{
    $x = ($x*2) + ($y*2);
    return $x;
}
$a = 2;
$b = 2;
echo getMultiply2($a, $b);

// Функция, которая высчитывает факториал заданного числа
function factorial(int $x) 
{
    if ($x == 1)
{
    return 1;
}   
elseif ($x == 0) {
    return 1;
}
return $x * factorial($x-1);
} 
echo 'Факториал числа равен: ' . factorial(25);

// Функция выводящая последовательность целых чисел
function number(int $x) {
    if ($x == 0) {
    echo $x;
    return;
}
    if ($x<0) {
    echo $x . ',' . number($x+1);
    return;
}
number($x-1);
echo ',' . $x;
}
number(3);  

Последнее задание делал опираясь на подсказки и примеры в комментах...

ivashkevich
  1. Всегда используйте фигурные скобки в блоках условий - это стандарт в PHP. Если x и y не являются минимальными, то не надо проверять что z меньше y. Это единственный оставшийся вариант.
  2. Перечитайте задание второй задачи.
  3. ОК. Но если передать -3, то после 0 не будет запятой.
s-kiryak@meta.ua

Спасибо, замечания учел.
Исправил вывод результата в задании:

function number(int $x)
{
    if ($x == 0) {
        echo $x;
        return;
    }
    if ($x<0) {
        echo ', ' . $x . number($x+1);
        return;
    }
    number($x-1);
    echo ', ' . $x;
}
echo number(-2) . '.';
ivashkevich

Красава

expert12@yandex.ru
<?php

//Задание 1

function getMinFloat(float $x, float $y, float $z)
{if ($x>=$y&&$y>=$z){
          return $z;}          
            elseif($y>=$x&&$z>=$x){ 
            return $x;}
             {return $y;}
}
$a = 8.25;
$b = 0.37;
$c = 3.37;
echo 'Наименьшее число : '. getMinFloat($a, $b, $c).'<br>'.'<br>';

//Задание 2

function product2(&$a, &$b){
    $a=$a*2; 
    $b=$b*2; 
}
$a=4;
$b=3;
product2($a, $b);
echo "Значение первой переменной - $a".'<br>';
echo "Значение второй переменной - $b".'<br>'.'<br>'; 

//Задание 3

function getFactorial(int $n){
    if ($n == 1){
     return 1;}
     return $n *getFactorial($n-1);
} 
$n=6;
echo 'Результат - ' . getFactorial($n).'<br>'.'<br>';

//Задание 4

function getNum(int $x){
echo $x.'<br>';
    if($x==0){
     exit;}     
    return $x=getNum($x-1);}
$x = 5; 
echo getNum($x);
ivashkevich

Исправьте отступы в первом задании, ничего не понятно. Переносите все на новые строки, как в уроках. С факториалом та же история. В шторме можно просто нажать CTRL+ALT+L и он сам все отформатирует как надо.

В четвертом задании не нужно использовать exit, это завершает работу всего скрипта. Вам же нужно просто завершить работу функции.

То, что все это работает - хорошо =)

Boodoo

Напишите функцию, которая будет принимать на вход 3 аргумента с типом float и возвращать минимальное значение.

<?php
    function lowerNum(float $a, float $b, float $c) {
        if($a < $b) {
            if($a < $c) {
                return $a;
            } else {
                return $c;
            }
        } else {
            if($b < $c) {
                return $b;
            } else {
                return $c;
            }
        }
    }
    echo lowerNum(5.2,3.1,4.6);
ivashkevich

Ок. Оформляйте код (самая первая кнопка в редакторе комментария)

Boodoo

Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 2.

<?php
    $a = 3;
    $b = 4;
    function func(&$a, &$b) {
        $a *= 2;
        $b *= 2;
    }
    func($a, $b);
    echo $a . '<br>';
    echo $b;
Boodoo

Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного). Ну разумеется, тут никуда без рекурсии =)

<?php
    function fact($x, $n) {
        if($n == 1) {
            return $x;
        } else {
            return $x * fact($x, ($n - 1));
        }
    }
    echo fact(5, 3);
ivashkevich

Это что-то не то. Прочитайте, что такое факториал. Должен быть только один аргумент.

Boodoo

Действительно, задумался о чем-то...
вот

<?php
    function fact($x) {
        if($x == 1) {
            return $x;
        } else {
            return $x * fact($x - 1);
        }
    }
ivashkevich

Ок. Только типы аргументов указывайте.

Boodoo

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

<?php
    function func($x, $y = 0) {
        if($y >= $x) {
            return $y;
        } else {
            echo $y . '<br>';
            return func($x, $y+1);
        }
    }
    echo func(5);
ivashkevich

Можно обойтись функцией с одним аргументом. А то что работает - это уже хорошо.

artemship

Задача 1:

function getMin(float $x, float $y, float $z)
{
    if (($x < $y) && ($x < $z)) {
        return $x;
    } elseif (($y < $x) && ($y < $z)) {
        return $y;
    }
    return $z;
}

$a = 3.6;
$b = 7.8;
$c = 9.3;
echo 'Минимальное число: ' . getMin($a, $b, $c);

Задача 2:

function multiplicationBy2(float &$x, float &$y)
{
    $x *= 2;
    $y *= 2;
}

$a = 2.2;
$b = 3.3;
multiplicationBy2($a, $b);
echo $a . '<br>' . $b;

Задача 3:

function getFactorial($x)
{
    if ($x == 1) {
        return $x;
    }
    return $x * getFactorial($x - 1);
}

$a = 5;
echo getFactorial($a);

С задачей №4 не справился. Почитав комменты, разобрался) Следующим уроком надеюсь закреплю знания по рекурсии! Спасибо большое за уроки, все очень доступно и понятно! За домашку отдельное спасибо!

ivashkevich
  1. Неправильно работает
    $a = 3.6;
    $b = 3.6;
    $c = 9.3;
    echo 'Минимальное число: ' . getMin($a, $b, $c);

    Вывод: Минимальное число: 9.3

  2. ОК
  3. ОК
  4. Удачи =)
artemship

Да, накосячил..) Спасибо за помощь! Вот, поправил:

function getMin(float $x, float $y, float $z)
{
    if (($x < $y) && ($x < $z)) {
        return $x;
    } elseif ($y < $z) {
        return $y;
    }
    return $z;
}

$a = 3.6;
$b = 7.8;
$c = 9.3;
echo 'Минимальное число: ' . getMin($a, $b, $c);
ivashkevich

Теперь ок

Dram

Добрый день, прошу понять почему этот код не работает? Специально не смотрел комменты, хочу сам понять и написать свое решение.

<?php

function getFloatMin(float $a, $b, $c)
{
    if ($a <= $b && $c) {
        return $a;
    } elseif ($b <= $a && $c) {
      return $b;
    }
    else {
        return $c;
    }
}
$a=4.45;
$b=1.22;
$c=1.1;

echo 'Минимально: ' . getFloatMin($a, $b, $c);

ВОТ ПРАВИЛЬНО

<?php

function getFloatMin(float $a, $b, $c)
{
if ($a <= $b && $a<=$c) {
return $a;
} elseif ($b <= $a && $b <= $c) {
return $b;
}
return $c;

}
$a=4.45;
$b=1.22;
$c=1.1;

echo 'Минимально: ' . getFloatMin($a, $b, $c);

НО ПРОШУ ОБЪЯСНИТЬ
ПОЧЕМУ НЕВЕРНЫЙ 1 вариант

ivashkevich

$a <= $b && $c - что вы здесь пытаетесь сделать?

Dram

Я думал так можно записать А меньше или равно В и С

ivashkevich

Так нельзя. Прочитайте официальную документацию о приоретизации операторов. Здесь выполняется проверка на то что:
($a меньше либо равно $b) И (значение $c, приведенное к булеву типу == true)

anmanist@gmail.com
<?

function getMinimal(float $a, float $b, float $c) {
  $minimal = $a < $b ? $a : $b;
  $minimal = $minimal < $c ? $minimal : $c;
  return $minimal;
}

echo getMinimal(1, 3, 2),'<br><br>';

function doubleVar(&$a, &$b) {
  $a *= 2;
  $b *= 2;
}

$a = 8;
$b = 12;

doubleVar($a, $b);
echo $a, '<br>',$b,'<br><br>';

function factorial(int $a)
{
  if ($a == 1) {
    return 1;
  }

  return $a * factorial($a - 1);
}

echo factorial(170),'<br><br>';

function showNumTill(int $a)
{
  if ($a == 0) {
    echo $a;
    return;
  }
  showNumTill($a-1);
  echo ','.$a;
}

echo showNumTill(17);
?>
ivashkevich
  1. Отлично
  2. Где типы?
  3. Отлично
  4. Отлично
anmanist@gmail.com

function doubleVar(&$a, &$b) {
Забавно, перед отправкой я вспомнил про типы, но потом почему-то решил, что раз это ссылки, то тут типы не нужны) Собственно, я ждал этого коммента, спасибо)

ivashkevich

Хех, типы нужны всегда)

pejma2001@mail.ru
<?php

function minNum(float $x, float $y, float $z){
    if ($x<$y and $x<$z){
    return $x;
    }elseif ($y<$x and $y<$z){
    return $y;
    } 
    return $z;
    }
$f=5.5;
$i=13.8;
$u=44;

echo minNum($f,$i,$u);
?>
Решение задача №1.
ivashkevich

Ок. После блока, в котором выполняется return не обязательно писать elseif, можно просто if.

pejma2001@mail.ru

Задача №2.

<?php

function lynk(&$x, &$z){
    $x=$x*2;
    $z=$z*2;

    }
$f=5;
$i=13;

lynk($f,$i);
echo $f. ' , ' .$i;
?>
ivashkevich

Типы аргументов не забывайте

pejma2001@mail.ru
<?php

function factorial(int $x){
    if($x==1){
        return 1;
    }
return $x*factorial($x-1);
}
echo 'Результат: ' . factorial(3);
?>
ivashkevich

Отлично

pejma2001@mail.ru

Это третья задача. Поясните, пожалуйста, вот эта строка в вашей лекции о рекурсии 'return $n + getSumOfNumbersFromZero($n - 1);' означает какой-то цикл? Так как последовательно складывает все числа. Я не понимаю как он узнает, что нужно еще складывать и еще... Пока не будет 1. Т.е. почему он продолжает считать дальше? Мог бы прибавить $n к функции с ($n-1) и на этом остановиться.

ivashkevich

Ну, вообще-то он так и делает-останавливается именно на этом. Просто перед этим считает getSumOfNumbersFromZero($n - 1)

pejma2001@mail.ru

Объясните, пожалуйста, как работает код ниже. Если можно построчно что он делает. Не понимаю как он выводит числа по порядку.

<?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);
ivashkevich

Напишите в личку

krollik1000000@gmail.com
function getFloat(float $a,float $b,float $c)
{
    if ($a < $b && $a < $c) {
        return $a.'<br>';
    } else if ($b < $a && $b < $c) {
        return $b.'<br>';
    }
    return $c.'<br>';
}
echo getFloat(12.4,11.5,23.5);

$a = 3;
$b = 4;

function multiplication(&$x,&$q)
{
    echo $x * 2 . '<br>';
    echo $q * 2 . '<br>';

}
multiplication($a,$b);

function factorial($a)
{
    if ($a !== 1) {
        return $a * factorial($a - 1);
    }
    return $a;
}
echo factorial(5).'<br>';

function show(int $a)
{
    if ($a !== 0) {
        echo show($a - 1);
    }
    return $a;
}
echo show(5);
ivashkevich
  1. Функция должна возвращать число, а не строку. При следующих входных данных:
    echo getFloat(12.4,12.4,23.5);

    возвращает

    less all:23.5

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

  2. Функция должна изменить значения аргументов, а не вывести их умноженными на два. То есть после вызова функции значения обеих переменных должны увеличиться на 2.
  3. ОК
  4. Для чего в конце возвращается $a? Это где-то используется?

По поводу вашего вопроса - в настройках PHPStorm нужно выставить версию PHP не ниже 7.0.

krollik1000000@gmail.com

я понял свою ошибку в 4 задаче

ivashkevich

А по остальным когда поправите?

Moskva

Код:

 function minValue(float $x1, float $x2, float $x3)
    {
        if (($x1 < $x2) && ($x1 < $x3)) {
            return $x1;
        } else if ($x2 < $x3) {
            return $x2;
    } else return $x3;
    }
    echo 'Результат: ' . minValue(1.5, 1,1.2);
    echo '<br>';

    function multiply(&$x, &$y){
        $x *= 2;
        $y *= 2;
        return 0;
    }
    $x = 5; $y = 6;
    echo multiply($x, $y);
    echo '<br>';
    echo $x . ' ' . $y;
    echo '<br>';

    function factorial($n){
        if ($n == 1){
            return $n;
        } else if ($n == 0){
            return 0;
        }
        return $n * factorial($n-1);
    }
    echo factorial(5);
    echo '<br>';

    function digit(int $n){
        $y = $n;
        if ($n == 0){
            echo $n;
            return 0;
        }elseif ($n < 0){
            echo $y . ', ';
            $y = digit($n+1);
        }else {
            $x = digit($n - 1);
            echo ', ' . $n;
        }
    }
    digit (6);

Результат:
Результат: 1
0
10 12
120
0, 1, 2, 3, 4, 5, 6

ivashkevich
  1. В блоках if-else ВСЕГДА используйте фигурные скобки, даже если там один return.
  2. Для чего в конце return 0?
  3. Факториал 0 = 1
  4. ОК
Moskva

Вас понял

function minValue(float $x1, float $x2, float $x3)
{
    if (($x1 < $x2) && ($x1 < $x3)) {
        return $x1;
    } elseif ($x2 < $x3) {
        return $x2;
    } else {
        return $x3;
    }
}

echo 'Результат: ' . minValue(1.5, 1, 1.2);

function multiply(&$x, &$y)
{
    $x *= 2;
    $y *= 2;
}

$x = 5;
$y = 6;
echo multiply($x, $y);
echo '<br>';
echo $x . ' ' . $y;
echo '<br>';

function factorial($n)
{
    if ($n == 1) {
        return $n;
    } else if ($n == 0) {
        return 1;
    }
    return $n * factorial($n - 1);
}

echo factorial(4);
echo '<br>';

function digit(int $n)
{
    $y = $n;
    if ($n == 0) {
        echo $n;
        return 0;
    } elseif ($n < 0) {
        echo $y . ', ';
        $y = digit($n + 1);
    } else {
        $x = digit($n - 1);
        echo ', ' . $n;
    }
}

digit(6);

Вроде всё исправил.

ivashkevich

Ок. Ещё заметил, что не указаны типы аргументов во 2 и 3 задачах.

bratko

1 задание

function minValue(float $x, float $y, float $z){
    return min($x, $y, $z);
}
echo 'Результат: ' . minValue(1, 10, 18);

Правильно ли я сделал? Смотрю все выполняли данное задание через условия, а если есть уже стандартная функция поиска минимального значения..?!?!

ivashkevich

Засчитано. Но по-хорошему стоит реализовать на простейших условиях.

Bocha

Второе:

<?php

function getComposition(int &$x, int &$y)
{
    $x = $x*2;
    $y = $y*2;
}

$a = 5;
$b = 4;

getComposition($a, $b);

echo "$a <br>";
echo $b;
Bocha

Признаюсь честно - решение подглядел, но потом, вроде бы, разобрался

<?php

function getFactorial($x)
{
    if ($x == 1 || $x == 0){
        return 1;
    }
    return $a = $x * getFactorial($x - 1);
}

$a = 5;

echo getFactorial($a);
ivashkevich

Вот здесь

return $a = $x * getFactorial($x - 1);

не нужно сначала присваивать значение переменной $a. Просто:

return $x * getFactorial($x - 1);
esqrx
<?php

function minimalSum(float $x, float $y, float $c)
{
    if ($x <= $y & $x <= $c) {
        echo 'Минимальное число ' . $x;
    } elseif ($y <= $x & $y <= $c) {
        echo 'Минимальное число ' . $y;
    } else echo 'Минимальное число ' . $c;

}

minimalSum(1.2, 1.1, 1.5);

echo '<hr>';

function multiplication($x, $y)
{
    echo $x . ' множенное на 2 будет ' . $x * 2 . ' и ' . $y . ' множенное на 2 будет ' . $y * 2;
}

multiplication(3, 5);

echo '<hr>';

function factorial($a)
{
    if ($a == 1 || $a == 0) {
        return 1;
    }
    var_dump($a);
    return $a * factorial($a - 1);
}
echo factorial(7);

echo '<hr>';

function task5 (int $x) {
    if ($x == 0) {
        echo $x;
        return;
    }
    task5($x - 1);
    echo ', ' . $x;
}

task5(10);
ivashkevich

Ни одно решение не соответствует задачам и примерам из урока

esqrx
<?php

// 1

function minimalSum(float $x, float $y, float $c)
{
    $minNumber = 0;
    if ($x <= $y && $x <= $c) {
        $minNumber = $x;
    } elseif ($y <= $x && $y <= $c) {
        $minNumber = $y;
    } else {
        $minNumber = $c;
    }
    return $minNumber;
}

var_dump(minimalSum(1.1, 1.2, 1.3));
var_dump(minimalSum(1.2, 1.3, 1.1));
var_dump(minimalSum(1.3, 1.1, 1.2));

// 2

echo '<hr>';

function multiplication(int &$x, int &$y)
{
    $result = $x * 2 . ', ' . $y * 2;
    return $result;
}

$a = 3;
$b = 5;

var_dump(multiplication($a, $b));

// 3

echo '<hr>';

function factorial(int $a)
{
    if ($a == 1 || $a == 0) {
        return 1;
    }
    var_dump($a);
    return $a + factorial($a - 1);
}

var_dump(factorial(4));
ivashkevich
  1. Отлично. Только непонятно, почему функция называется minimalSum? Ничего ведь не суммируется.
  2. Функция не должна возвращать значение. Она должна изменить значения по ссылке.
  3. var_dump в рабочей функции быть не должно! Вычисления не верны. Почитайте, что такое факториал.
esqrx
  1. ХЗ, я все с цифрами почему-то называю Sum...
  2. Да, понял, исправил
  3. я когда пишу код везде эти var_dump-ы прописываю чтобы следить за выполнением кода, потом забываю удалять. и формулу исправил
// 2

function multiplication(int &$x, int &$y)
{
    $x *= 2;
    $y *= 2;
}

$a = 3;
$b = 5;

multiplication($a, $b);
echo $a . ', ' . $b;

// 3

echo '<hr>';

function factorial(int $a)
{
    if ($a == 1 || $a == 0) {
        return 1;
    }
    return $a * factorial($a - 1);
}

var_dump(factorial(4));
ivashkevich

Теперь отлично.
P.S. Используйте для оформления кода самую первую кнопку в окне написания комментариев.

Gnev1992@mail.ru

Первое задание. Стараюсь пока не смотреть подсказки в чате, поэтому наверно много лишнего, когда уже вижу что работает как надо, смотрю варианты для упрощения) Но тут выкладываю что сам навыдумывал для честности.

<?php
function minNum(float $x, float $y, float $z)
{
    if ($x < $y && $x < $z) {
        return 'Минимальное число:' . $x;
    } elseif ($y < $z) {
        return 'Минимальное число:' . $y;
    }
    return 'Минимальное число:' . $z;
}

echo minNum (7.9, 1, 3);
ivashkevich

Функция должна возвращать число.

Gnev1992@mail.ru
<?php
function minNum(float $x, float $y, float $z)
{
    if ($x < $y && $x < $z) {
        return $x;
    } elseif ($y < $z) {
        return $y;
    }
    return $z;
}

echo 'Минимальное число:' . minNum(7.9, 1, 3);

А так ?)

ivashkevich

Так - огонь

Gnev1992@mail.ru

Вторая задача, не уверен нужен ли здесь Return в конце функции ?

<?php
function getMult(&$a, &$b ){
    echo $a * 2 . '<br>' . $b * 2;
    return;
}
$a= 2;
$b= 3;
getMult ($a,$b);
ivashkevich

Неверно. После вызова функции значения переменных должны удвоиться. У вас они остались прежними. Выводить в функции ничего не надо.

Gnev1992@mail.ru
<?php
function getMult(&$a,&$b)
{
    return $a * 2 . $b * 2;
}
$a = 2;
$b = 3;
echo getMult($a,$b);
ivashkevich

Нет. После вызова функции можно сделать echo $a, и значение будет больше изначального в 2 раза. Перечитайте про передачу по ссылке.

Gnev1992@mail.ru
<?php
function getMult(&$a, &$b)
{
    $a = $a * 2;
    $b = $b * 2;
}

$a = 2;
$b = 3;
getMult($a, $b);
echo $a . '<br>';
echo $b;

Теперь должно работать)

ivashkevich

Теперь ок

Gnev1992@mail.ru

Третье задание.

<?php
function getFactorial(int $n)
{
    if ($n == 1) {
        return 1;
    }
    return $n * getFactorial($n - 1);
}
echo getFactorial(5);

ответ 120

ivashkevich

Отлично

Nick
# Минимальное число из трех предложенных:

function minFloat(float $a, float $b, float $c) {
  $min = $a < $b ? $a : $b;
  $min = $min < $c ? $min : $c;
  return $min;
}

echo minFloat(1.22, 3.558, 0.585); // 0.585

# Умножение аргументов на 2:

function double(&$a, &$b) {
  $a *= 2;
  $b *= 2;
}

$firstNumber = 5;
$secondNumber = 4.75;
double($firstNumber, $secondNumber);
echo "<br>$firstNumber, $secondNumber<br>"; // 10, 9.5

# Факториал числа (рекурсия):

function factorialRecursion(int $n) {
  if ($n === 1)
      return 1;
  return $n * factorialRecursion($n - 1);
}

echo factorialRecursion(5) . '<br>'; // 120

# Самое сложное задание (?...) :

function somethingScary($a, $b = 0) {
  echo $b;
  if (floor($a) > $b && $a > 0)
      somethingScary($a, $b + 1);
  if (ceil($a) < $b && $a < 0)
      somethingScary($a, $b - 1);
}

echo '<br>' . somethingScary(8.5);
ivashkevich

Хорошо всё с логикой. Замечания только по кодстайлу, в соответствии с PSR:

  • Фигурная скобка, открывающая тело функции, должна находиться на отдельной строке.
  • в конструкциях if-else всегда ставятся фигурные скобки, даже если там одна строчка.

Во второй и четвертой функциях не хватает типов аргументов.

P.S. Лучше каждое решение отдельным комментарием.

Bizzzon

<?php
function lessOfNumbers(float $x, float$y, float $z) : float {
    if ($x < $y and $x < $z) {
        return $x;
    } elseif ($y < $x and $y < $z) {
        return $y;
    } else {
        return $z;
    }
}
$a = 90.8;
$b = 90.9;
$c = 90.1;
echo 'Наименьшее число: ' .lessOfNumbers ($a, $b, $c);
?>
``` - первая задача. 
ivashkevich

Фигурная скобка, открывающая тело функции, переносится на новую строку.
Откуда у вас взялся оператор and? Пройдите заново урок про условия.

.lessOfNumbers ($a, $b, $c);

Пробел между именем вызываемой функции и скобкой не нужен. Оператор конкатенации строк с обоих сторон должен быть разделен пробелами.

Если передать 5,5,10, то вернётся 10, что неверно.

Bizzzon
function mult(int &$x, int &$y) : int {
    $x *= 2;
    $y *= 2;
} //ругается из-за этой фигурной скобки :<
$a = 20;
$b = 10;
mult($a, $b);
echo $a . ' ' . $b;

Выдаёт ошибку, можете подсказать, что я сделал не так?

ivashkevich

Текст ошибки говорит совсем о другом.

Bizzzon

Так в чём тогда моя ошибка?

ivashkevich

Напишите сюда текст ошибки

Bizzzon

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

ivashkevich

Написано, что функция mult должна возвращать integer, но ничего не возвращает. Так и есть.

Bizzzon

Т.е, каждая функция обязательно должна что-то возвращать? Но дальше я вызываю функцию...

ivashkevich

Нет, необязательно. Но вы сам написали :int в её объявлении. Если написан тип возвращаемого значения, значит должен быть return. Исключение - void. Как раз ваш случай.

Bizzzon
function mult(int &$x, int &$y) {
    $x = $x * 2;
    $y = $y * 2;
}
$a = 20;
$b = 10;
mult($a, $b);
echo $a . '; ' . $b;

Вот, работает без ошибки

ivashkevich

Ок. Не забывайте открывающую скобку переносить на новую строку. Это стандарт PSR-2.

Bizzzon
function factorial(int $number) : int
{
    if($number == 0) {
        return 1;
    }
    return $number * factorial($number - 1);
}
$x = 5;
echo 'Факториал числа ' . $x . ' равен' . ' ' . factorial($x);

3 задача

ivashkevich

Супер!

Reechniy

первое:

<?php
function getMin(float $x, float $y, float $z){
    if($x<$y&&$x<$z){
        return $x;
    }elseif($y<$z){
        return $y;
    }else{
        return $z;
    }
}
$x=3.4;
$y=3.2;
$z=3;
echo 'Minimum:'.getMin($x,$y,$z);

второе:

<?php
function multiply2(&$x,&$y)
{
    $x=$x*2;
    $y=$y*2;
}
$x=4;
$y=2;
multiply2($x, $y);
echo 'число Х'.$x;
echo '<br><br>';
echo 'число У'.$y;

третье:

<?php
function fucktorial($n)
{
    if($n==1){
        return 1;
    }
    return $n*fucktorial($n-1);
}
echo 'Результат: '.fucktorial(12);
ivashkevich

Логика - ок. Но не указаны типы аргументов во 2 и 3 заданиях.

kvakazuabr

пишите здесь ваш код
// 4
``function getValues(int $n) {
        if($n >= 0) {
          echo $n . ' ' . getValues($n-1);   
        } 
    }`
ivashkevich

Отлично

AlexxxEy
print 'Умножение двух переменных по ссылке';
print '</br>';
function ArgAdr(&$q , &$n){
    $q = $q * 2;
    $n = $n * 2;
}

$p = 4;
$d = 6;
ArgAdr($p, $d);
print $p;
print '</br>';
print $d;
print '</br>';

print '</br>';

print 'Найти минимальынй аргумент';
print '</br>';
function ArgMin(float $x, float $y, float $z){

    if ($x < $y && $x < $z) {
        return $x;
    } elseif ($y < $x && $y < $z) {
        return $y;
    } elseif ($z < $x && $z < $y) {
        return $z;
    }
}
    $x = 5.2;
    $y = 3.7;
    $z = 6.22;

print ArgMin($x, $y, $z);
print '</br>';
print '</br>';
print 'Получить факториал числа';
function FactNum($l){

    if($l == 1){
        return $l;
    }
    return $l * FactNum($l-1);
}
print '</br>';
print FactNum(6);
print '</br>';
print '</br>';

print 'Вывести на экран челый числа от 0 до переданного';
function ArfPr($h){

    if($h == 0){
        echo $h;
        return 0;
    }
    else {
        ArfPr($h - 1);
        echo $h;
    }

}
print '</br>';
print ArfPr(6);
print '</br>';
ivashkevich
function ArfPr($h){
    if($h == 0){
        echo $h;
        return 0;
    }
    else {
        ArfPr($h - 1);
        echo $h;
    }
}

Для чего return 0;?

ArgMin(5, 5, 5);
Функция ничего не вернёт, хотя минимальное число - 5.

Имена функций пишутся с маленькой буквы.

Пришлите исправленный вариант ответом на это сообщение.

denis_vsalda@mail.ru

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

function SomeDeal($n) {
    if ($n != 0) {
        SomeDeal($n-1);
    }
    echo $n . ' ';
}
ivashkevich

Потому что написать простой код сложнее, чем написать сложный код) Всё хорошо, только имена функций должны начинаться с маленькой буквы. Это стандарт PSR.

denis_vsalda@mail.ru

Просто учил до этого C# поэтому для меня пока немного дико, что методы тоже начинаются с маленькой буквы

ivashkevich

Привыкнете, я тоже на нескольких языках пишу с разными правилами

lenapetrowa92@gmail.com
Привет!
**1 задние **
function getMinimal ($x,$y,$z)
{
    if ($x < $y) {
        if ($x < $z) {
            return $x;
        } elseif ($y < $x) {
            return $y;
        } else return $z;
    }
}
$a=10;
$b=3;
$c=5;
echo getMinimal ($a,$b,$c),'<br>';

**2 задание**
function func (&$x,&$y){
    $x=$x*2;
    $y=$y*2;
}
$a=2;
$b=3;
func ($a,$b);
echo $a,'<br>',$b,'<br>';

**и 3ее**
function factorial ($x){
         if ($x==1) {
             return 1;
         }
         return ($x*factorial ($x-1));
}

echo factorial(5);

4ое пока сложновато =(
ivashkevich

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

} else return $z;

В PHP для блоков if-else всегда используется оборачивание в фигурные скобки.

Aleks

Поправил

<?php

#Функция принимает 3 значения с типом float и выводит минимальное значение
function minValue(float $x, float $y, float $z)
{
    if ($x < $y && $x < $z) {
        return $x;
    } elseif ($y < $z) {
        return $y;
    } else {
        return $z;
    }
}
$a = 2;
$b = 3;
$c = 2;

echo minValue($a, $b, $c) . '<br>';
ivashkevich

Если передать 5,5,10, то вернётся 10, что неверно.

Aleks

Поправил

ivashkevich

Теперь если передать 2, 3, 1, то вернёт 2. Не торопись.

Aleks

Еще раз поправил

ivashkevich

Теперь ок

Aleks

Напишите функцию, которая принимает на вход два аргумента по ссылкам и умножает каждый из них на 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;
ivashkevich

Отлично

Aleks
<?php
#Напишите функцию, считающую факториал числа (произведение целых чисел от единицы до переданного)
#Ну разумеется, тут никуда без рекурсии
function factorial(int $x)
{
    if ($x == 1) {
        return 1;
    }
    return $x * factorial($x - 1);
}

echo factorial(4);
ivashkevich

Отлично

Aleks

Последняя

<?php
# Напишите функцию, которая будет выводить на экран целые числа от 0 до переданного значения.
# И да, тут тоже не обойтись без рекурсии, это задание повышенной сложности.
# Кто справится и первым напишет верное решение в комментах – тот красавчик и получит от проекта небольшой бонус.
function intNumber (int $x)
{
    if ($x == 0) {
        echo $x;
    } else {
        echo  $x - intNumber($x - 1);
    }
}
intNumber(6.7);
ivashkevich

Что с форматированием? Кто вас учил в одну строку всё лепить? Делайте переносы, как в уроках.

return там ни к чему, функция и так завершится на этом.

Выводит числа не в том порядке. Нужно от 0 до переданного значения.

Aleks

Исправил, вывод теперь с 0
Форматирование поправил.

ivashkevich

Отлично

Vladimir96
//Домашнее задание
    //Поиск минимального значения
    function getMinimumNumber(float $number_1, float $number_2, float $number_3)
    {
        return  min($number_1, $number_2, $number_3);
    }
    echo "Минимальное значение: ";
    echo getMinimumNumber(15.3,10.4,30);

    echo "<br>";

    //Ссылки
    function ArgumentsByReference (int &$reference_1, int &$reference_2)
    {
        $reference_1 *= 2;
        $reference_2 *= 2;
    }

    $NumberForFunctionReference_1 = 10;
    $NumberForFunctionReference_2 = 28;

    ArgumentsByReference ($NumberForFunctionReference_1, $NumberForFunctionReference_2);

    echo 'Результат первой ссылки: ' . $NumberForFunctionReference_1;
    echo '<br>';
    echo 'Результат второй ссылки: ' . $NumberForFunctionReference_2;

    echo "<br>";

    //Факториал числа
    function getFactorialNumbers (int $argumentForFacktorial)
    {
        if ($argumentForFacktorial == 1) {
            return $argumentForFacktorial;
        }

        return $argumentForFacktorial * getFactorialNumbers($argumentForFacktorial - 1);
    }
    echo "Факториал: ";
    echo getFactorialNumbers(5);

    echo "<br>";

    //Вывод целых чисел
    function integerOutput (int $numberForOutput)
    {
        if($numberForOutput == 0) {
            return $numberForOutput;
        }

        echo $numberForOutput - integerOutput($numberForOutput - 1);
        echo "<br>";
    }

    integerOutput(8);
    //От последнего чуть коньки не отбросил
ivashkevich

$number_1 - в именах переменных не должно быть подчеркиваний.
Функцию поиска минимального числа рекомендую написать самостоятельно, хотя формально с заданием вы справились.

ArgumentsByReference - имена методов и переменных пишутся с маленькой буквы.

По логике - всё отлично

Vladimir96

Почему при вызове функции внутри себя самой записывается только результат аргументов? Хотя внутри функции также есть выражение, но его просто игнорируют, когда функция вызывает саму себя.(см. код)

   //пример
   function integerOutput (int $numberForOutput)
{
    if($numberForOutput == 0) {
        return $numberForOutput;
    }
    //ВОТ ВЫРАЖЕНИЕ
    echo $numberForOutput - integerOutput($numberForOutput - 1);
    echo "<br>";
}

integerOutput(8);
ivashkevich

Вообще не понял вопроса. Кто там что игнорирует? Вызов функции внутри себя самой не отличается от вызова этой же функции откуда-то ещё.

Ooleg

Последнее задание не мог решить, не учёл, что работа функции приостанавливается на время вызова из неё другой функции, так может и додумался бы. Добавьте пожалуйста этот нюанс в урок, для будущих таких же тугодумов как я)

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!';

?>
ivashkevich

minFloat - а чего всё в одну строку? Сделай нормальные отступы, как у меня в уроках. Функция должна возвращать значение, а не выводить его.

getFactorialis

if ($n < 1) { return false;}

Функция не должна возвращать разные типы данных. Если она возвращает int, то никакого false там быть не должно.

else echo 

Для блоков if-else всегда используйте фигурные скобки. Где-то успели уже нахвататься плохих примеров. Переучивайтесь.

Ooleg

Спасибо за замечания, буду отучаться от плохих примеров.

romaartemov1999@gmail.com
<?php
function getMin(float $a,float $b,float $c)
{
    $A = $a-$b;
    $B = $a-$c;
    $C = $b-$c;
    if($A > 0){
        if($C > 0){
            return $c;
        }else{
            return $b;
        }
    }else{
        if($B > 0){
            return $c;
        }else{
            return $a;
        }
    }
}

$a = 0.5;
$b = 0.9;
$c = 5;

echo "Наименьшее число :" . getMin($a,$b,$c);
ivashkevich

Как-то сложно. Тут достаточно простых сравнений. Имена переменных ни о чем не говорят. Имена переменных в PHP всегда должны начинаться с маленькой буквы.

romaartemov1999@gmail.com
<?php
function opa(int $n)
{
    if ($n  == 0) {
        echo $n;
      return ;
    }
    $y = opa( $n - 1);
      echo ' ,' . $n;
      return $y;
}
$n = 5;

echo  opa($n);
ivashkevich

Что с отступами? Нужно выровнять.
Непонятно для чего return y, если там всегда null. И для чего echo перед

echo  opa($n);

Разберитесь и исправьте.

Clawson
<?php

function minOfFloat (float $x, float $y, float $z)
{
  return $x < $y ? ($x < $z ? $x : $z) : ($y < $z ? $y : $z);
}

function multBy2 (&$x, &$y)
{
  $x *= 2;
  $y *= 2;
}

function factorial(int $x)
{
  if ($x == 1) {
      return $x;
    }
  return $x * factorial($x-1);
}

function spamNum ($x)
{
  if ($x == 0) {
      echo $x . '<br>';
      return;
    }
  echo $x . '<br>' . spamNum($x-1);
}

$x = 1.3;
$y = 1.4;
$z = 1.2;

echo 'x = ' . $x . '<br>y = ' . $y . '<br>z = ' . $z . '<br>';

echo 'Минимальное из трех: ' . minOfFloat($x, $y, $z) . '<br>';

echo 'Умножим x и y на 2 испульзуя функцию с ссылками на две переменные.<br>';
multBy2($x, $y);
echo 'x = ' . $x . '<br>y = ' . $y . '<br>';

$w = 5;
echo 'Дано число ' . $w . '. Его факториал равен: ' . factorial($w) . '<br>';
echo 'Вывод чисел от 0 до заданного: (' . $w . ')<br>';
spamNum($w);

Минут 20 вдуплял рекурсию %) Очень понравилось последнее задание)

ivashkevich
  1. Плохо читаемый код, на if логика прозрачнее
  2. function multBy2 (&$x, &$y) - после имени функции не должно быть пробелов. У аргументов должны быть типы аргументов.
  3. Отлично
  4. Тип аргумента не указан.

Отлично, что поняли рекурсию. Исправляйте мелкие недочеты и вперед)

Clawson

Учту замечания. Спасибо.

Dreft
<?php
    function minVal(float $x, float $y, float $z)
    {
        if (($x < $y && $x < $z)) {
            return $x;
        } elseif ($y < $z) {
            return $y;
        } else {
            return $z;
        }
    }

    echo 'Минимальное число:  ' . minVal(10, 5, 2);
    echo '<hr/>';

    function multiply(int &$x, int &$y)
    {
        $x *= 2;
        $y *= 2;
    }

    $a = 4;
    $b = 5;
    multiply($a, $b);
    echo $a . "<br/>" . $b;
    echo "<hr/>";

    function factorial(int $x)
    {
        if ($x == 1 || $x == 0) {
            return $x;
        }
        return $x * factorial($x - 1);
    }
    echo 'Факториал = ' . factorial(5);
    echo '<hr/>';

function printNums(int $x)
{
    if ($x == 0) {
        echo $x;
        return;
    }
    printNums($x - 1);
    echo '-', $x;
}
echo printNums(10);
ivashkevich
  1. Функция должна всегда!!! возвращать число. Даже если они все равны. Если передам 10, 5, 2, то вернётся 10. А это нифига не минимальное.
  2. Где типы аргументов?
  3. Где типы? Почему условие в одну строку? Где вы у меня в уроках такое видели? Переделывайте.
  4. Ок
Dreft

Поправил

ivashkevich

Супер! Красава!

Monstrsostrova

4 задача, так получилось, не обязательно же через рекурсию

for($i=1; $i<=100; $i++){
    if($i%2==0){
        echo ',' ."$i";
}
}
ivashkevich

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

Monstrsostrova
<?php
function num($x) {
    if($x==0){
        return 0;
    }
    return num($x-1);
}
echo ',' .num(10);

попробовал так, что то не работает, хотя по логике вроде как должно. Подскажи пожалуйста в чем не правда?
ivashkevich

Функция должна выводить числа. А здесь нет ни одной конструкции, которая бы что-либо выводила. Вот оно и не работает.

Monstrsostrova

понял, спасибо, все получилось. Спустя 2 дня вроде поняд рекурсию

ivashkevich

Тогда жду рабочий вариант)

Monstrsostrova
<?php
function num($x) {

    if($x==0){
         echo 0;
        return;
    }
    num($x-1);

echo ',' . $x;
}
num(10);
ivashkevich

Где тип аргумента?

KseniaM
/*Напишите функцию, которая будет выводить на экран целые числа от 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);
ivashkevich

Где типы аргументов?

prinzplanloser0514@gmail.com
<?php
function minimum(float $a, float $b, float $c)
{
    return min($a, $b, $c);
}

echo(minimum(3, 10, 100));
?>

Так же можно сделать?

ivashkevich

Нуу, не оч. Хотелось бы увидеть вашу логику в решении задачи.

Floppy
<?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);
ivashkevich

Для чего вся эта магия?

Floppy

Захотелось показать альтернативу и возможность использование $$ Переменные переменных

ivashkevich

Непонятно, почему максимальное значение 0.0. А если я передам в функцию только отрицательные числа?

getMaxValueUnlimArg(...$_) - здесь проще было сделать именованную переменную и получить на входе массив. Опять же, типы аргументов пропали.

multiplyValue(&$value1, &$value2) тоже типов нет

Не стоит бежать впереди поезда. Лучше делать просто но качественно, чем не до конца понимая как.

Floppy

Для первой функции правильней было бы указать $maxValue = $value1;

Какой вариант был бы лучшем для решения

function getMaxValue(float $value1, float $value2, float $value3): float
{
    $maxValue = $value1;
    if ($value1 < $value2) {
        $maxValue = $value2;
    }
    if ($value2 < $value3) {
        $maxValue = $value3;
    }
    return $maxValue;
}

function getMaxValueAlternative(float $value1, float $value2, float $value3): float
{
    if ($value1 > $value2 && $value1 > $value2) {
        return $value1;
    } elseif ($value2 > $value1 && $value2 > $value3) {
        return $value2;
    } else {
        return $value3;
    }
}

p.s. к типам ещё не как не привыкну, учил php ещё 3.х

ivashkevich

p.s. к типам ещё не как не привыкну, учил php ещё 3.х

Ах вот в чем дело. Ну старайтесь переучиваться.

getMaxValue

Если передам 3,1,2 то вернёт 2, что неверно.

getMaxValueAlternative

Если передам 2,1,3 то вернёт 2, и это тоже неверно.

Floppy

Поправил ошибки

<?php
function getMaxValue(float $value1, float $value2, float $value3): float
{
    $maxValue = $value1;
    if ($maxValue < $value2) {
        $maxValue = $value2;
    }
    if ($maxValue < $value3) {
        $maxValue = $value3;
    }
    return $maxValue;
}

function getMaxValueAlternative(float $value1, float $value2, float $value3): float
{
    if ($value1 > $value2 && $value1 > $value3) {
        return $value1;
    } elseif ($value2 > $value1 && $value2 > $value3) {
        return $value2;
    } else {
        return $value3;
    }
}
H3licoptero
Минимальное значение.
<?php

function minValue (float $x, float $y,float $z)
{
    if ($x < $y && $x < $z) {
        return $x;
    } elseif ($z > $y) {
        return $y;
    } else {
        return $z;
    }

}

$a = 11.2;
$b = 1.1;
$c = 11.3;
echo minValue( $a, $b, $c);

Аргументы по ссылке.

function argsMultiple (int &$x, int &$y) 
{
    $x = $x * 2;
    $y = $y * 2;
}

$a = 10;
$b = 5;

argsMultiple($a, $b);
echo $a, '<br>';
echo $b, '<br>';

Факториал.
function getFactorial(int $n)
{
    var_dump($n);
    if ($n == 20){
        return 20;
    }
    return getFactorial($n + 1);
}

echo getFactorial(1);

Так ли? А то рекурсия пока сильнее меня, кажется)

function getInteger (int $x)
{

    if ($x == 0) {
        return '<br>' . 0;
    } elseif ($x < 0) {
        echo '<br>' . $x;
        return getInteger($x + 1);
    } else {
        echo '<br>' . $x;
        return getInteger($x - 1);
    }
}

echo getInteger(-10);
echo '<br>';
echo getInteger(10);

Storm ругался на скалярные типы и не давал указать их. Говорил, что только в 7-ой версии доступно и выдавал ошибку синтаксиса, а тут уже 7.4 подъехала. Вот я и решил, что пока так. Да и debug вчера не работал. Вроде исправил. Так?

ivashkevich

Скобка, открывающая тело функции, переносится на следующую строку. Где типы аргументов? Как будто урок и не читали. Исправьте, потом остальное посмотрю.

dliashchenko
<?php
function minNumber( float $a, float $b, float $c)
{
    if ($a < $b && $a < $c) {
        return $a;
    }
    elseif ($a > $b && $b < $c){
        return $b;
    }
    elseif ($a > $c && $b > $c){
        return $c;
    }
}

echo "Наименьшее число: ".minNumber(24.1, 30.4, 25.1);

echo "<br/>";

function linkNumber( int &$a, int &$b)
{
    $a = $a * 2;
    $b = $b * 2;
    return " $a, $b";
}

$z = 2;
$q = 4;

echo "Умножение на 2 по ссылкам".linkNumber($z, $q);

echo "<br/>";

function factorialNumber( int $a)
{
    if ($a == 1){
        return 1;
    }
    return $a * factorialNumber( $a - 1);
}

echo "Факториал ".factorialNumber(12);

echo "<br/>";

function wholeNumbers( int $a)
{
    if ($a == 0 ){
        echo $a;
        return;
    }
    wholeNumbers($a - 1);
    echo ", ".$a;
}

wholeNumbers(12);

Исправил

ivashkevich
return "Есть одинаковые значения!";

Функция должна возвращать числа. Всегда. Если несколько чисел равны и являются минимальными, возвращать любое из них.

linkNumber( &$a, &$b){

Где типы аргументов?

factorialNumber( $a){

Фигурная скобка, открывающая тело функции, пишется на следующей строке.

function Number

Имена функций пишутся с маленькой буквы.

Такое чувство, что урок вообще не читали.

prinzplanloser0514@gmail.com
<?php

function numbers(int $n)
{
    if ($n == 0) {
        echo '0'.'<br>';
        return 0;
    }
    $f=1 + numbers($n-1);
    echo $f.'<br>';
    return $f;
}
numbers(10);

Как-то так.

ivashkevich

Пойдет, но можно проще, без суммирования

Evilinside
<?php

//1ая задача
function getMinOfNumbers(float $x, float $y, float $z)
{

    if ($x < $y && $x < $z) {
        return "Число x: {$x} минимальное";
    } elseif ($y < $x && $y < $z) {
        return "Число y: {$y} минимальное";
    }else
        return "Число z: {$z} минимальное";
}
echo  getMinOfNumbers(1,1.1,1.2);

///////////////////////////////////////////////

// 2ая задача

function getProduct(&$num1, &$num2 ){

    $num1*=2;
    $num2*=2;
    echo $num1."\n";
    echo $num2;
}
$a=3;
$b=2;
 getProduct($a,$b);

///////////////////////////////////////////////

// 3я задача

function getFactrorial(int $num)
{
    if ($num < 0) {
        return 0;
    } elseif ($num == 0) {
        return 1;
    }
    return $num * getFactrorial($num - 1);
}

echo getFactrorial(0);

///////////////////////////////////////////////

// 4ая задача
function getInteger(int $num)
{
    if ($num === 0) {
        echo $num . "\n";
    } else
        echo $num + getInteger($num - 1) . "\n";
}

getInteger(20);

Расскажите, пожалуйста, как часто в реальной практике используется рекурсия? Нужна ли рекурсия, когда можно воспользоваться циклами?

ivashkevich
  1. Функция должна возвращать ЧИСЛО! А не строку. Если передать 2, 2, 3, то напишет про 3, что тоже неверно.
  2. Где типы аргументов?
  3. Ок
  4. Функция должна выводить просто последовательность чисел. У вас там суммирование какое-то, дичь в общем.

Рекурсия нужна при обходе древовидных структур данных, при работе с вложенными сущностями. Ну и в математических вычислениях тоже порой позволяет упростить код. Что выбирать, цикл или рекурсию, решает разработчик.

kvakazuabr

пишите здесь ваш код
```1.
function getMin(float $x, float $y, float $z) {
    return $x <= $y && $x <= $z  ? $x : $y <= $x && $y <= $z  ?  $y : $z; 
}
 echo getMin(5.1, 9.0, 4.4);
2.
function sum(int &$x, int &$y) {
    $x *= 2;
    $y *= 2;
}
$a = 4;
$b = 3;

sum($a, $b);
echo $a;
echo '<br>';
echo $b;
3.
function fact(int $n) {
    if ($n==0||$n==1||$n==2) {
        return $n;
    }
    return $n * fact($n-1);
}

echo fact(7);
4.
уже решал 
ivashkevich
  1. Код должен быть понятным. Здесь все в одну строку, не разобраться.
    Если передам 2, 2, 3, вернёт 3, что не является минимальным значением.
    Вызывается несуществующая функция - var_dump(getMax(5.1, 9.0, 4.4));
    То есть ваш код попросту не работает. В следующий раз не буду даже разбирать. Отправляемые решение должно быть как минимум рабочим.
  2. Где типы аргументов? Урок читали?
  3. Где тип аргумента?
kvakazuabr

все работает вернет 2

ivashkevich

Хм. Мне казалось там не было "либо равно".

kvakazuabr

там не было = это я ошибся все верно

ivashkevich

Теперь отлично

zuxarevaalina88@gmail.com
<?php
function getMin(float $x, float $y, float $z)
{
    if (($x < $y) && ( $x < $z ))
{return $x;}
    elseif ($y < $z)
{return $y;}

  else
{ return $z;}

}

$a = 225.5;
$b = 30.1;
$c = 15.5;
echo 'Наименьшее число: ' . getMin($a, $b, $c);
?>
<?php

function Multiple2  (&$x, &$y)
{
$x=$x*2;
$y=$y*2;
}
$b=5;
$c=10;
Multiple2 ($b, $c);
echo $b;
echo ' ';
echo $c;
?>
<?php

function fact(int $n)
{

    if ($n == 1) {
        return 1;
    }

    return $n * fact($n - 1);
}

echo 'Результат: ' . fact(4);
ivashkevich

Что с переносами фигурных скобок? Сделайте как в уроке.

  1. Если передать 2,2,3 то вернёт 3. Это неверно.
  2. Имена функций пишутся с маленькой буквы. Куда пропали типы аргументов?
  3. Всё ок
zuxarevaalina88@gmail.com

Передаю 2,2,3 возвращает 2. false&true=false значит переходим к elseif получается true и возвращает 2. Или что-то я не так поняла?

ivashkevich

Прошу прощения, с логикой действительно всё правильно. Исправьте тогда по остальным пунктам.

zuxarevaalina88@gmail.com

Спасибо, по остальным все понятно, исправлю!

NrG
function minOfThreeNum (float $a, float $b, float $c)
{
    if ($a < $b && $a < $c) {
        return $a;
    } elseif ($b < $a && $b < $c) {
        return $b;
    }
    return $c;
}
echo 'Минимальное из трех чисел: ' . minOfThreeNum(3.2, 4.7, 2.1);

function multiplicationByTwo (int &$x,int &$y)
{
    $x *= 2;
    $y *= 2;
}
$a = 3;
$b = 8;
multiplicationByTwo($a, $b);
echo $a; // Результат 6
echo $b; // Результат 16

function factorial (int $a)
{
    if ($a == 1) {
        return 1;
    }
    return $a * factorial($a -1);
}
echo factorial(4); // Результат 24
ivashkevich
minOfThreeNum(2, 2, 3)

Возвращает 3

anton-gogo@mail.ru
<?php
echo 'Минимальное значение';
echo '<br>', '<br>';
function minValue($a, $b)
{
    if ($a < $b) {
        return $a;
    }elseif ($a > $b) {
        return $b;
    }else {
        echo 'Нет минимального значения';
    }
}
echo minValue(4, 5);
echo '<br>';
echo 'Ссылки';
echo '<br>', '<br>';
function links(&$c, &$d)
{
    $c = $c * 2;
    $d = $d * 2;
}

$e = 4;
$f = 5;

links($e, $f);

echo $e, '<br>', $f;
echo '<br>';
echo 'факториал';
echo '<br>', '<br>';
function factorial($g)
{
    if ($g == 0 || $g == 1) {
        return 1;
    }
    return $g * factorial($g - 1);
}
echo factorial(3);
echo '<br>';
echo 'Пересчет до нужного числа';
echo '<br>', '<br>';

function minus($h)
{
    var_dump($h);
    if ($h == 1) {
        return 1;
    }elseif ($h == 0) {
        return 0;
    }elseif ($h < 0) {
        return minus($h + 1);
    }
    return minus($h - 1);
}
minus(10);

Минимальное значение

4
Ссылки

8
10
факториал

6
Пересчет до нужного числа

int(10) int(9) int(8) int(7) int(6) int(5) int(4) int(3) int(2) int(1)

ivashkevich

Где типы аргументов?!
Поиск минимального числа должен быть среди трёх чисел. Функция должна возвращать минимальное число а не строки!
Последняя функция тоже неправильно работает.
Ужасно. Перечитайте и урок и домашнее задание.

Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Логические задачи с собеседований