Ruby 为什么在这个阶乘代码(无递归)中,步骤是-1而不是+;1.
为什么在这段计算阶乘的代码中,步骤是-1,而不是+1? 如果程序中只有n<0和n>0,它如何计算n=0Ruby 为什么在这个阶乘代码(无递归)中,步骤是-1而不是+;1.,ruby,algorithm,Ruby,Algorithm,为什么在这段计算阶乘的代码中,步骤是-1,而不是+1? 如果程序中只有n0,它如何计算n=0 def factorial(n) if n < 0 return nil end result = 1 while n > 0 result = result * n n -= 1 end return result end def阶乘(n) 如果n0时 结果=结果*n n-=1 结束 返回结果 结束 它计算n=0,因为result默认
def factorial(n)
if n < 0
return nil
end
result = 1
while n > 0
result = result * n
n -= 1
end
return result
end
def阶乘(n)
如果n<0
归零
结束
结果=1
当n>0时
结果=结果*n
n-=1
结束
返回结果
结束
它计算n=0
,因为result
默认设置为1
。当n
为0
时,循环将不会运行(因为n
不是>0
),因此将返回result
的默认值(即1
)
它每次减去一,这样它就可以向下计算所有的数字,所以
5!=5*4*3*2*1
如果每次添加一个,则会
5!=5*6*7*8
等等。因此,这不仅是错误的,而且是一个无限循环。步骤是-1,因此将n*(n-1)*(n-2)*……*的所有值相乘1.因为乘法从n开始,然后向下,所以希望步长为负。(或者,您可以从1开始,一直到n。在这种情况下,您希望步骤为+1。这不是此实现的工作方式。)
由于在while循环之前,默认设置为
result=1
,因此该程序仍然适用于0的输入。在这种情况下,将跳过循环体。步骤为-1而不是+1的原因是while循环在n>0时运行。因此,如果您要执行n+=1
,您将拥有一个无限循环
如果要使用迭代器设置for循环,则可以启动迭代器,直到迭代器
1*2*3==3*2*1
,因此从算术上讲,上移还是下移都无关紧要。但是,递减参数n
可以直接用于计算结果
,而不是基于一个额外的单独变量进行计算,该变量会不断递增,直到到达n
也就是说,这仍然不是一种非常简单的做事方式。我可能会选择这样的方式:
def factorial(n)
n == 0 ? 1 : (1..n).inject(:*)
end
您还询问了实现如何将
阶乘(0)
计算为1。如果n==0
whilen>0循环从未被激活,那么从初始化result=1
开始,跳到return
语句。4!=4*3*2*
或2*3*4
。这段代码的作者决定从4
(参数n
)开始往下写。(没有代码注释,没有人知道为什么结果没有初始化为n
,然后递减n
,并将其乘以结果,1
)我明白了!在代码中设置为1,但为什么设置为0!还是等于1?@sagarpandya2这就是数学中对阶乘函数的定义@实际上,这是一个有趣的问题,但我不知道答案。我知道数学家们决定这样定义它,我只是不知道为什么。