Проблема в рекурсивной фукции?

Добрый вечер! Есть задача поиска ближайшего значения. Например есть товар с ценой 12, кто-то ставить такую же цену, система должна понять, что товар с такой ценой есть и добавить 0.1 к цене. Чтобы вышло 12.1, но если и эта цена занята то добавить еще 0.1.

В двух словах, нужно найти ближайшую от введенной, свободную цену с шагом 0.1

public function findCorrectClosestPrice($price, $products)
    {
        foreach ($products as $product)
        {
            if ($product->price === $price)
            {
                $price = $price + 0.1;
                return $this->findCorrectClosestPrice($price, $products);
            }
            else
            {
                return $price + 0.1;
            }
        }

        return null;
    }


Проблема в том, что если уже есть цены 12, 12.1 и я допустим ставлю 12, то появляеться 2 товара с ценой 12.1, хотя должа установиться 12.2. Вопрос простой, но я правда не вижу ошибки в своем коде, тыкните носом, очень прошу.
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
twobomb
@twobomb
Кстате можно и без рекурсии. Только при сравнении делайте округление, а то может оказаться что 12.3 != 12.3 , ох уж эти числа с плавающей точкой и php...
public function findCorrectClosestPrice($price, $products){
	do{
		$finded = false;
	foreach ($products as $product){		
			if (round($product->price,1) == round($price,1)){
				$price += 0.1;
				$finded = true;
				break;
			}
	}
	}while($finded);
    return $price;
}


P.S. Рекурсией будет так
public function findCorrectClosestPrice($price, $products){
	foreach ($products as $product)		
			if (round($product->price,1) == round($price,1))
				return $this->findCorrectClosestPrice($price + 0.1,$products);
    return $price;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Так возьмите массив [12, 12.1, 12] и прокрутите свой код.
Сами увидите, что ваша функция делает отнюдь не то, что вы заявляете.
Вам нужно делать не рекурсию, а сортировку по цене вверх и вложенный цикл.
Как только во внешнем цикле находится повтор, запускаете внутренний, чтобы определить, куда переставить текущий элемент. Переставляете, назначаете ему цену предыдущего + 0.1 и возвращаетесь на то же место внешнего цикла, поскольку массив сполз назад из-за перестановки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы