You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:30:49