euler project 3 ruby​​>为什么这个解决方案有效?

时间:2014-10-14 01:58:31

标签: ruby arrays syntax

def large_prime(n)
  return [] if n==1 
  factor = (2..n).find {|x| n % x == 0}
  [factor] + large_prime(n/factor)
end

我从其他地方得到了这个解决方案。我不理解第四行代码,其中以递归方式调用large_prime并将其附加到因子上 当我更改第一行“return []”并在返回后省略'[]'时,我收到第4行的错误消息,即“+”:没有将nil隐式转换为数组。 那么为什么这段代码有效呢?感谢

P.S。我显然是一个菜鸟,对我来说一切都很新鲜。

2 个答案:

答案 0 :(得分:0)

第3行在n2之间找到n的第一个除数。这一行本身不涉及递归。

我并没有真正得到你修改过的代码,但在某些情况下似乎返回nil,而原始方法总是返回一个数组。

答案 1 :(得分:0)

传递1时必须返回一个空数组以终止递归。除了一个之外的任何正参数都会导致另一个large_prime的调用,但参数为1会导致large_prime只返回一个空数组。

在每个递归级别,程序将一个数组添加到一个数组中,该数组包含为值n/factor找到的所有因子。当找到最后一个因子(除1之外)时,最后调用large_prime的参数为1,large_prime返回一个空数组,然后将该数组添加到包含最后一个因子的数组中,给出一个只包含最后一个因子的数组。然后返回此数组,您就可以了 [next-to-last-factor] + [last-factor],提供[next-to-last-factor, last-factor]的返回数组,该数组已添加到[next-to-next-to-last-factor],提供[next-to-next-to-last-factor, next-to-last-factor, last-factor]。然后将其添加到阵列[next-to-next-to-next-to-last-factor]中,给予......起泡,冲洗,重复,直至达到最大因子并加入。

您必须返回一个空数组,因为您无法将nil添加到Ruby中的数组中。