Php 任何解决方案都是正确的解决方案吗?

Php 任何解决方案都是正确的解决方案吗?,php,fibonacci,Php,Fibonacci,在解决了一个编程难题之后,我总是对自己说,“这很有效,已经足够好了” 在我看来,我不认为这是一种真正正确的思维方式,我认为我应该一直努力以最好的性能编写代码 总之,说到这里,我只是试着问了一个问题。特别是问题2 我该如何改进此解决方案。我觉得它真的很冗长。就像我在递归中传递上一个数字一样 <?php /* Each new term in the Fibonacci sequence is generated by adding the previous two terms.

在解决了一个编程难题之后,我总是对自己说,“这很有效,已经足够好了”

在我看来,我不认为这是一种真正正确的思维方式,我认为我应该一直努力以最好的性能编写代码

总之,说到这里,我只是试着问了一个问题。特别是问题2

我该如何改进此解决方案。我觉得它真的很冗长。就像我在递归中传递上一个数字一样

<?php
  /* Each new term in the Fibonacci sequence is generated by adding the previous two
     terms. By starting with 1 and 2, the first 10 terms will be:

     1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

     Find the sum of all the even-valued terms in the sequence which do not exceed
     four million.
   */
   function fibonacci ( $number, $previous = 1 ) {
     global $answer;
     $fibonacci = $number + $previous;
     if($fibonacci > 4000000) return;
     if($fibonacci % 2 == 0) {
       $answer = is_numeric($answer) ? $answer + $fibonacci : $fibonacci;
     }
     return fibonacci($fibonacci, $number);
   }
   fibonacci(1);
   echo $answer;
?>

注意这不是家庭作业。几百年前我离开了学校。我只是觉得很无聊,正在处理项目中的问题

解决问题后,我总是自言自语 我面临的编程挑战 已经被束缚了一段时间,”它说 工作,这就足够了”

我认为这不是真正的问题 正确的心态,在我和我看来 我想我应该一直努力 性能最好的代码

中介绍的一个经典内容是,程序员在给定目标的情况下,可以使用许多指标中的一个来创建“最佳”计算机程序,但不可能同时对所有参数进行优化。参数,例如

  • 代码可读性
  • 代码输出的可理解性
  • 代码长度(行)
  • 代码执行速度(性能)
  • 编写代码的速度
您可以随意优化这些参数中的任何一个,但请记住,同时优化所有这些参数可能是一种挫折感,或者导致系统设计过度


你应该问问自己:你的目标是什么?在这种情况下,“足够好”是什么?如果你只是在学习,想让事情变得更优化,那就千方百计去做吧,要知道一个完美的程序需要无限的时间来构建,时间本身就是宝贵的。

这里的其他人也说过“这是示例问题与真实业务问题的一部分。”

这个问题的答案很难回答,原因有很多:

  • 语言起着巨大的作用。有些语言更适合某些问题,因此,如果您遇到不匹配的情况,您会发现您的解决方案“不够雄辩”
  • 这取决于你必须解决问题的时间,解决问题的时间越长,你就越有可能找到你喜欢的解决方案(尽管有时情况正好相反,时间太多会让你三思而后行)
  • 这取决于你的总体满意度。我曾在几个项目中工作过,我认为其中一些部分很棒,代码编写得很漂亮,而另一些部分完全是垃圾,但它们超出了我有时间解决的问题

我想底线是,如果你认为这是一个好的解决方案,并且你的客户/购买者/团队/等都同意,那么这是一个好的解决方案。将来你可能会改变主意,但现在这是一个很好的解决方案。

我没有实际测试这个。。。但在称之为“完成”之前,我个人会尝试在这个解决方案中解决一些问题

通过使用和参数实现递归,尽可能避免全局变量

编辑:根据nnythm的算法建议进行更新(酷!)


使用解决问题的代码执行时间不应超过一分钟的准则。这是欧拉问题最重要的,依我看

除此之外,只需确保其可读性——确保您可以轻松查看代码的工作方式。这样,如果你遇到一个像你解决的欧拉问题这样的问题,你就可以更容易地看到事情是如何运作的,这反过来又可以让你更快地解决这个问题——因为你已经知道应该如何解决它


你可以为自己设定其他标准,但我认为这超出了Euler问题的意图——对我来说,问题的背景似乎比其他任何东西都更适合关注效率和可读性

你可以通过三次操作来避免mod 2部分(每三个元素都是偶数),所以它是这样写的: $fibonacci=3*$number+2*$previous; fibonacci的新输入是($fibonnacci,2*$number+$previous) 我不熟悉php,所以这只是一般的算法建议,我不知道它的语法是否正确。这实际上是相同的操作,它只是用一些乘法来代替模和加法

此外,请确保序列中以$number开头为偶数,以$previous开头为其前面的奇数(可以以$number开头为2,以$previous开头为1,并且总和也从2开始)。

[耸耸肩]

解决方案应根据需求进行评估。如果所有的要求都得到满足,那么其他一切都是莫西。如果所有需求都得到满足,并且您个人对解决方案不满意,那么可能需要重新评估需求。这就是你们能回答的关于元物理问题的范围,因为我们开始进入项目管理和商业:s

嗯哼,关于你的Euler项目问题,就我两便士:

  • 考虑重构为迭代,而不是递归
  • 注意,这个系列中的每三个术语是偶数?一旦给出了起始条件,就不需要模化
  • 比如说

    public const ulong TermLimit = 4000000;
    
    public static ulong CalculateSumOfEvenTermsTo (ulong termLimit)
    {
        // sum!
        ulong sum = 0;
    
        // initial conditions
        ulong prevTerm = 1;
        ulong currTerm = 1;
        ulong swapTerm = 0;
    
        // unroll first even term, [odd + odd = even]
        swapTerm = currTerm + prevTerm;
        prevTerm = currTerm;
        currTerm = swapTerm;
    
        // begin iterative sum,
        for (; currTerm < termLimit;)
        {
            // we have ensured currTerm is even,
            // and loop condition ensures it is 
            // less than limit
            sum += currTerm;
    
            // next odd term, [odd + even = odd]
            swapTerm = currTerm + prevTerm;
            prevTerm = currTerm;
            currTerm = swapTerm;
    
            // next odd term, [even + odd = odd]
            swapTerm = currTerm + prevTerm;
            prevTerm = currTerm;
            currTerm = swapTerm;
    
            // next even term, [odd + odd = even]
            swapTerm = currTerm + prevTerm;
            prevTerm = currTerm;
            currTerm = swapTerm;
        }
        return sum;
    }
    
    公共建设期限限制=4000000;
    公共静态ulong计算ulong期限限制
    {
    //求和!
    乌隆和=0;
    //初始条件
    ulong prevTerm=1;
    ulong Current=1;
    ulong swapTerm=0;
    //展开第一个偶数项[奇数+奇数=偶数]
    swapTerm=当前术语+前术语;
    prevTerm=当前期限;
    currTerm=天鹅座;
    //开始迭代求和,
    对于(;currentermpublic const ulong TermLimit = 4000000;
    
    public static ulong CalculateSumOfEvenTermsTo (ulong termLimit)
    {
        // sum!
        ulong sum = 0;
    
        // initial conditions
        ulong prevTerm = 1;
        ulong currTerm = 1;
        ulong swapTerm = 0;
    
        // unroll first even term, [odd + odd = even]
        swapTerm = currTerm + prevTerm;
        prevTerm = currTerm;
        currTerm = swapTerm;
    
        // begin iterative sum,
        for (; currTerm < termLimit;)
        {
            // we have ensured currTerm is even,
            // and loop condition ensures it is 
            // less than limit
            sum += currTerm;
    
            // next odd term, [odd + even = odd]
            swapTerm = currTerm + prevTerm;
            prevTerm = currTerm;
            currTerm = swapTerm;
    
            // next odd term, [even + odd = odd]
            swapTerm = currTerm + prevTerm;
            prevTerm = currTerm;
            currTerm = swapTerm;
    
            // next even term, [odd + odd = even]
            swapTerm = currTerm + prevTerm;
            prevTerm = currTerm;
            currTerm = swapTerm;
        }
        return sum;
    }