【问题标题】:How do I calculate the factorial of a number in Ruby?如何计算 Ruby 中数字的阶乘?
【发布时间】:2014-02-25 12:05:12
【问题描述】:

好的,所以我就我的语法错误问了一个较早的问题。我摆脱了错误,但程序并没有按照它的意图做。我的数学是错误的,没有找到尾随零的数量。这是我的代码:

num = " "
a = 0
sumOfFact = 1

def factorial
    num = gets.to_i
    a = num
    (1..num).each do |a|
        if a != 1
            sumOfFact *= a
            a -= 1
        else
            break
        end
    end
end

for c in 1..sumOfFact
    if sumOfFact / c == 10
            zeros += 1
    end
end

factorial()
puts sumOfFact
puts zeros

【问题讨论】:

  • 我看到了一些变量、一个方法定义、一个 for 循环、一个方法调用和一些 put。我有点困惑:所有这些代码的上下文是什么?它应该如何交互?到目前为止,您的输出是什么?
  • 是的。 Stack Overflow 中没有“延续”之类的东西。请正确记录您的问题,因为它需要作为一个独立的项目来理解。

标签: ruby if-statement for-loop syntax factorial


【解决方案1】:

嗯,首先,你应该在你的方法之外进行gets。你的方法应该接受一个参数。二、为什么需要条件?

您希望从 1 到 n 的乘法得到阶乘。你应该从这个开始:

def factorial(n)
  total = 1
  (1..n).each do |n|
    total *= n   
  end
  total
end

puts factorial(gets.to_i)

如果你想学习新语法,接下来是使用注入的阶乘:-)

def factorial(n)
  n == 0? 1 : (1..n).inject(1) { |total, i| total*= i; total }
end

puts factorial(gets.to_i)

正如@pjs 在下面评论的那样,这是一种很好的阶乘方式!

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

还有,最后的增强:

def factorial(n)
  (1..n).inject(1, :*)
end

【讨论】:

  • OP 对 Ruby 了解不多,你给他#inject...lollz :)
  • 注入是什么意思?看不懂就不想用了。
  • @user3251611 请不要使用#inject..现在.. :)
  • 更干净的应该是n.zero? ? 1 : (1..n).inject(:*),只要你使用的是inject...
  • 顺便说一句@pjs,漂亮的解决方案!
【解决方案2】:

假设n是一个非负整数,你可以定义一个计算阶乘的方法:

def factorial(n)
  tot = 1
  (1..n).each do |n|
    tot *= x
  end

  tot
end

使用示例:

puts factorial(0) # 1 
puts factorial(1) # 1
puts factorial(2) # 2 
puts factorial(3) # 6
puts factorial(4) # 24
puts factorial(5) # 120 

如果你不想读取用户输入,可以这样称呼它:

puts 'Type the non-negative integer:'
n = gets.to_i
puts factorial(n)

【讨论】:

    【解决方案3】:
    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
    

    或者你可以简单地写:

     (1..num).inject(:*) || 1
    

    【讨论】:

      【解决方案4】:

      也试试这个。希望这可以帮助任何人以某种方式遇到同样的问题。

      求任意数的阶乘方法:

      def factorial(number)
          for i in 1...number do
              number *= i
          end
          number
      end
      
      puts factorial(5)
      

      【讨论】:

      • 你能解释一下吗?
      • 第一句之后的一切似乎都是代码。代码应通过在编辑器中标记并按 Crtl+K 来格式化。就像现在一样,阅读起来很困难。
      • 看起来更好。谢谢。下次我会尽量说清楚:)
      猜你喜欢
      • 2015-04-19
      • 2021-05-29
      • 2023-03-22
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多