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。我显然是一个菜鸟,对我来说一切都很新鲜。
答案 0 :(得分:0)
第3行在n
和2
之间找到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中的数组中。