所以我把这个问题作为计算机课上的一项任务,我完全不知道为什么解决方案是这样的。我希望有人能够彻底向我解释。
我的问题是:
n*(n-1)*(n-2)*...*2*1
实际上只是数学表达式n!这只是一个我必须记住的神奇公式吗? (是的,除了算术之外我不太了解数学)编写一个取整数
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}")
答案 0 :(得分:1)
是的,这是阶乘的定义。通过学习定义,人们就知道了。
编码阶乘的方法有很多种。你的恰好是最基本的一个。随着您对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