代码之家  ›  专栏  ›  技术社区  ›  rutger

Ruby阶乘函数

  •  83
  • rutger  · 技术社区  · 14 年前

    我疯了:阶乘的红宝石函数在哪里?不,我不需要教程实现,我只需要库中的函数。这不是数学!

    我开始怀疑,这是标准的图书馆功能吗?

    17 回复  |  直到 6 年前
        1
  •  131
  •   sepp2k    14 年前

    标准库中没有factorial函数。

        2
  •  100
  •   Alexander Revutsky    12 年前

    这样比较好

    (1..n).inject(:*) || 1
    
        3
  •  77
  •   Taryn East    13 年前

    它不在标准库中,但您可以扩展integer类。

    class Integer
      def factorial_recursive
        self <= 1 ? 1 : self * (self - 1).factorial
      end
      def factorial_iterative
        f = 1; for i in 1..self; f *= i; end; f
      end
      alias :factorial :factorial_iterative
    end
    

    注意:由于明显的性能原因,迭代阶乘是更好的选择。

        4
  •  22
  •   fearless_fool    6 年前

    无耻地从 http://rosettacode.org/wiki/Factorial#Ruby ,我个人最喜欢的是

    class Integer
      def fact
        (1..self).reduce(:*) || 1
      end
    end
    
    >> 400.fact
    => 64034522846623895262347970319503005850702583026002959458684445942802397169186831436278478647463264676294350575035856810848298162883517435228961988646802997937341654150838162426461942352307046244325015114448670890662773914918117331955996440709549671345290477020322434911210797593280795101545372667251627877890009349763765710326350331533965349868386831339352024373788157786791506311858702618270169819740062983025308591298346162272304558339520759611505302236086810433297255194852674432232438669948422404232599805551610635942376961399231917134063858996537970147827206606320217379472010321356624613809077942304597360699567595836096158715129913822286578579549361617654480453222007825818400848436415591229454275384803558374518022675900061399560145595206127211192918105032491008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    

    这种实现在Rosetta代码中列出的变体中也是最快的。

    更新第1号

    补充 || 1 处理零情况。

    更新第2号

    感谢并感谢 Mark Thomas ,这是一个更高效、更优雅、更模糊的版本:

    class Integer
      def fact
        (2..self).reduce(1,:*)
      end
    end
    
        5
  •  13
  •   PeeHaa    13 年前

    你也可以用 Math.gamma 函数,它归结为整数参数的阶乘。

        6
  •  12
  •   Albert Renshaw    8 年前

    在数学中, factorial of n 只是 gamma function of n+1
    (见: http://en.wikipedia.org/wiki/Gamma_function )

    露比有 Math.gamma() 所以只需使用 Math.gamma(n+1) 如果需要的话,将其转换回整数。

        7
  •  12
  •   jasonleonhard    8 年前
    class Integer
      def !
        (1..self).inject(:*)
      end
    end
    

    实例

    !3  # => 6
    !4  # => 24
    
        8
  •  8
  •   Santhosh    10 年前

    我会的

    (1..n).inject(1, :*)
    
        9
  •  6
  •   Jack Moon    12 年前

    我刚刚写了自己的:

    def fact(n)
      if n<= 1
        1
      else
        n * fact( n - 1 )
      end
    end
    

    此外,还可以定义一个下降阶乘:

    def fall_fact(n,k)
      if k <= 0
        1
      else
        n*fall_fact(n - 1, k - 1)
      end
    end
    
        10
  •  3
  •   Ayarch    11 年前

    使用 Math.gamma.floor 是生成近似值并将其舍入到正确整数结果的简单方法。应适用于所有整数,必要时包括输入检查。

        11
  •  3
  •   jasonleonhard    9 年前

    只需调用这个函数

    def factorial(n=0)
      (1..n).inject(:*)
    end
    

    实例

    factorial(3)
    factorial(11)
    
        12
  •  1
  •   Nate Beers    10 年前

    这只是另一种方法,尽管实际上并不必要。

    class Factorial
       attr_reader :num
       def initialize(num)
          @num = num
       end
    
       def find_factorial
          (1..num).inject(:*) || 1
       end
    end
    
    number = Factorial.new(8).find_factorial
    puts number
    
        13
  •  1
  •   Martin Vahi    10 年前

    你可能会发现一颗红宝石 feature request 有用的。它包含一个不平凡的 patch 其中包括 demo Bash script . 一个简单的循环和批处理中出现的解决方案之间的速度差可以是100倍(100倍)。全是用纯红宝石写的。

        14
  •  0
  •   Automatico    11 年前
    class Integer
      def factorial
        return self < 0 ? false : self==0 ? 1 : self.downto(1).inject(:*)
        #Not sure what other libraries say, but my understanding is that factorial of 
        #anything less than 0 does not exist.
      end
    end
    
        15
  •  0
  •   Sky Davis    10 年前

    还有另一种方式(=

    def factorial(number)
      number = number.to_i
      number_range = (number).downto(1).to_a
      factorial = number_range.inject(:*)
      puts "The factorial of #{number} is #{factorial}"
    end
    factorial(#number)
    
        16
  •  0
  •   Cliff Thelin    9 年前

    这是我的版本,我似乎很清楚,即使它不是那么干净。

    def factorial(num)
        step = 0
        (num - 1).times do (step += 1 ;num *= step) end
        return num
    end
    

    这是我的IRB测试线,显示了每一步。

    num = 8;step = 0;(num - 1).times do (step += 1 ;num *= step; puts num) end;num
    
        17
  •  0
  •   Eric Aya    7 年前

    还有一种方法可以做到:

    # fact(n) => Computes the Factorial of "n" = n!
    
    def fact(n) (1..n).inject(1) {|r,i| r*i }end
    
    fact(6) => 720