Ruby方法未定义错误:数字分区代码故障排查
排查你的Ruby数字分区代码问题
嘿,我帮你梳理下代码里的几个核心问题,这些问题不仅会触发方法未定义的错误,还会让你的分区逻辑彻底走不通:
1. 注释语法错误
Ruby里的单行注释是用#,不是//,你代码里的//number partitions方法这行是无效的,会直接触发语法解析错误,导致方法无法被正确定义。
2. 无限递归死循环
你在方法开头写了Particiones(n),这会让方法一调用就无限递归自己,要么直接栈溢出,要么程序卡死,根本出不来结果。
3. 循环范围的语法错误
for k in (n)..downto(0)是错误的写法,Ruby里downto是整数的实例方法,正确的写法应该是n.downto(1)(k从n降到1就行,0对数字分区没有意义)。
4. 递归逻辑完全错误
你写的cola= Particiones(n) - k完全不符合分区的逻辑,这里应该是递归获取n - k的分区结果,而且为了避免生成重复的分区(比如[2,1]和[1,2]属于同一个数字分区),我们需要保证每个子分区的第一个元素不大于k,这样就能生成非递增的分区,避免重复。
5. 变量作用域问题
你在内部for循环里定义particion= [k] + x,然后在循环外把particion添加到数组里,这会导致最后只添加了最后一次循环的particion,而且如果内部循环没执行的话,particion变量还没定义,会直接报错。
修复后的代码
我把这些问题都修正了,同时调整了命名风格符合Ruby的社区惯例,代码如下:
class NumPart def partitions(n) # 数字分区方法:返回n的所有不重复的整数分区(非递增顺序) return [[]] if n < 1 return [[1]] if n == 1 result = [] n.downto(1) do |k| # 递归获取n-k的分区,过滤出第一个元素<=k的分区,避免重复 partitions(n - k).each do |sub_part| # 子分区为空时直接添加[k],否则确保子分区第一个元素<=k if sub_part.empty? || sub_part.first <= k result << [k] + sub_part end end end result end end # 交互测试代码 puts "Ingrese el Valor de N: " n = gets.chomp.to_i num_part = NumPart.new puts "Las particiones de #{n} son:" num_part.partitions(n).each do |part| puts part.join(', ') end
修复说明
- 把类名和方法名改成了Ruby常用的蛇形命名(
NumPart和partitions),更符合社区习惯 - 修正了注释语法,用
#代替// - 移除了无限递归的调用,改成正确的递归逻辑:对每个k,获取
n-k的分区,再把k加到每个子分区前面 - 添加了
sub_part.first <= k的过滤条件,确保生成的分区是非递增的,避免重复结果 - 用
each迭代代替for循环,更符合Ruby的惯用写法 - 调整了变量作用域,确保每个子分区都能被正确添加到结果数组里
现在运行这段代码,输入一个数字就能得到正确的分区结果了。比如输入3,会输出:
3 2, 1 1, 1, 1
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

