新手:用于阶乘的Ruby编程

时间:2014-11-13 00:43:14

标签: ruby math

所以我把这个问题作为计算机课上的一项任务,我完全不知道为什么解决方案是这样的。我希望有人能够彻底向我解释。

我的问题是:

  1. 如何知道n*(n-1)*(n-2)*...*2*1实际上只是数学表达式n!这只是一个我必须记住的神奇公式吗? (是的,除了算术之外我不太了解数学)
  2. 是否有更好的编程因子的方法
  3.   

    编写一个取整数n的方法;它应该回来   n*(n-1)*(n-2)*...*2*1。假设n >= 0

         

    作为特例,factorial(0) == 1

         

    难度:容易。

    def factorial(n)
      if n < 0
        return nil
      end
    
      result = 1
      while n > 0
        result = result * n
    
        n -= 1
      end
    
      return result
    end
    
    
    puts("factorial(0) == 1: #{factorial(0) == 1}")
    puts("factorial(1) == 1: #{factorial(1) == 1}")
    puts("factorial(2) == 2: #{factorial(2) == 2}")
    puts("factorial(3) == 6: #{factorial(3) == 6}")
    puts("factorial(4) == 24: #{factorial(4) == 24}")
    

2 个答案:

答案 0 :(得分:1)

  1. 是的,这是阶乘的定义。通过学习定义,人们就知道了。

  2. 编码阶乘的方法有很多种。你的恰好是最基本的一个。随着您对Ruby的了解越来越多,您将开始能够编写更多惯用代码。例如......

    def factorial_functional(n)
      n < 0 ? nil : (1..n).inject(1, &:*)
    end
    
    def factorial_recursive(n)
      return if n < 0
      return 1 if n == 0
      n * factorial_recursive(n - 1)
    end
    

    可以说是什么更好&#34;,因为有很多因素:可读性,简洁性,速度,内存使用......可读性与目标受众直接相关:我&#39; m确保你的代码比我的任何一个例子都更具可读性,但对于有经验的人来说,通过更长的代码会更麻烦。

答案 1 :(得分:0)

Amadan已经展示了更好的编写factorials方法的方法,但我相信您也要求解释您带来的解决方案。

# The method `factorial` receives a number `n` and returns `n!`.
def factorial(n)
  if n < 0               # If the number `n` is negative
    return nil           # `n!` can't be calculated, so return nothing.
  end                    # Otherwise, go on...

  result = 1             # `result` is 1. For now...
  while n > 0            # While the number `n` is positive
    result = result * n  # `result` becomes `result` times `n`.
    n -= 1               # Decrease the number `n` by one.
  end
                         # Once the number `n` becomes zero, `result` is
                         # equal to the multiplication of all numbers from 1
                         # to what `n` was at the very beginning.
  return result          # Return `result`
end

我还想以简单的英语提供以下“更好”的方法来定义可以或多或少地阅读的factorial方法:

def factorial(number)
  return unless number.is_a? Integer and number >= 0

  total = 1

  number.downto 1 do |this_number|   
    total = total * this_number
  end

  return total
end