Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么在这个阶乘代码(无递归)中,步骤是-1而不是+;1._Ruby_Algorithm - Fatal编程技术网

Ruby 为什么在这个阶乘代码(无递归)中,步骤是-1而不是+;1.

Ruby 为什么在这个阶乘代码(无递归)中,步骤是-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默认

为什么在这段计算阶乘的代码中,步骤是-1,而不是+1? 如果程序中只有n<0和n>0,它如何计算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)
如果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这就是数学中对阶乘函数的定义@实际上,这是一个有趣的问题,但我不知道答案。我知道数学家们决定这样定义它,我只是不知道为什么。