草庐IT

php - 寻找这个循环的更优雅的解决方案

coder 2024-04-15 原文

我之前试过问这个问题,但我认为我没有正确地表述问题,所以我想出了一些让我得到我想要的结果的东西,现在我希望它能帮助别人帮助我。

问题:我有 10 件元素。如果您购买 1 个,则为 10 美元。我会以 9 美元的价格卖给你第二个。我会以 8 美元的价格卖给你第三件商品。我会一直减钱,直到我们达到 5 美元/件,因为这是我卖的最低价。因此,如果您购买全部 10 个,则需要 65 美元。

这是我试图实现的定价模型,但规模要大得多。我说的不是使用美元的少数元素,而是使用几分之一美分的数百万元素。

这是我当前的代码:

<?php 

function getCost($num_items)
{
    $min_price            = 0.002;
    $max_price            = 0.007;
    $discount_range       = 1000000;

    $discount_per_additional_item = ($max_price - $min_price) / ($discount_range - 1);

    $price_per_unit = MAX($min_price, ($max_price - ($num_items - 1) * $discount_per_additional_item) );

    return $price_per_unit;
}

$array = [100, 1000, 10000, 100000, 200000, 300000, 400000, 500000, 600000, 700000, 800000, 900000, 1000000];

foreach ($array as $value)
{

    $sum = 0;
    for ($i = 0; $i < $value; ++$i)
        $sum += getCost($i);

    echo number_format($value) . '  |  $' . number_format($sum) . "\n";

}

结果是:

100  |  $1
1,000  |  $7
10,000  |  $70
100,000  |  $675
200,000  |  $1,300
300,000  |  $1,875
400,000  |  $2,400
500,000  |  $2,875
600,000  |  $3,300
700,000  |  $3,675
800,000  |  $4,000
900,000  |  $4,275
1,000,000  |  $4,500

我使用 $array 作为健全性检查,在现实世界中,我会简单地计算客户被收取费用的实际数量。

我的问题是:有没有一种方法可以不使用 for 循环来完成此操作?也许,更优雅的东西?

我在网上做了一个例子:http://sandbox.onlinephpfunctions.com/code/47e270dbad8cbe16c9ea906ffd2dce098a52fbca

最佳答案

此代码将具有相同的输出,并且没有内部循环:

$min_price            = 0.002;
$max_price            = 0.007;
$discount_range       = 1000000;
$discount_per_additional_item = ($max_price - $min_price)/($discount_range - 1);

$num_progressively_discounted_items = 
        ceil(($max_price - $min_price) / $discount_per_additional_item);
foreach ($array as $value) {
    $num_items_above_min = min($value, $num_progressively_discounted_items);
    $num_items_at_min = $value - $num_items_above_min; 
    $sum = $num_items_at_min * $min_price + 
           $num_items_above_min * $max_price - 
           $discount_per_additional_item 
               * $num_items_above_min * ($num_items_above_min - 1)/2;

    echo number_format($value) . '  |  $' . number_format($sum) . "\n";
}

这是它的作用:

  • 它首先检查在达到最低价格之前可以从原始价格中减去多少次单位折扣。如果超过您要购买的商品数量,则计算出的数字会更正为该商品数量。
  • 剩余的商品数量(如果有的话)也会被记录下来:这些商品的价格都是最低的。
  • 总和由两部分组成。最简单的部分由将以最低价格出售的商品数量表示,它是一个简单的乘法。
  • 总和的第二部分包含一个始终递减的项,或者换句话说:它是未达到最低价格的商品数量的最高价格减去 0+1 的总和+2+3+4+5...+n。为此,公式是已知的:n(n-1)/2

就像我在评论中提到的,您的代码中有些奇怪:对于 $i=0getCost($i) 返回的值高于最大值价格,因为添加了单位折扣。这可以通过使用 $i=1 启动内部循环来纠正。无论如何,这意味着我建议的代码的结果存在微小差异,因为它没有这种特性。但由于每件产品的折扣非常小,您实际上不会在打印输出中注意到它。

关于php - 寻找这个循环的更优雅的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37400380/

有关php - 寻找这个循环的更优雅的解决方案的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  7. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  8. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  9. ruby-on-rails - Rails 优雅地处理超时 session ? - 2

    使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p

  10. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

    假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)

随机推荐