如何通过递归找到正确的价格?

时间:2019-06-05 20:35:32

标签: php recursion

首先,您好,抱歉我的英语。所以我的情况是要防止一种产品的价格相同。例如,我有3家提供商使用相同的产品,但价格不同

product 1 - 12 USD
product 1 - 12.1 USD
product 1 - 55 USD

如果我的价格是55,我想要设置12,则程序应设置12.2。原因12和12.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;
    }

有人可以告诉我我在哪里吗?

1 个答案:

答案 0 :(得分:1)

首先,我们需要更正代码。由于if ... else,您将始终在第一个产品上留下foreach循环和函数。

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

但是您还要处理浮点数,并且要使用===相同的比较运算符。那可能行不通。简而言之:

0.1 + 0.1 === 0.2

可能会返回false,因为两侧的浮点值并不完全相同。

解决方案并不困难,只是可以容忍一些细微差别。您可以这样操作:

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

还有其他方法可以执行此操作,但是它们基本上都避免了float值中可能出现的细微差别。