递归Ruby实例方法中神秘的空数组-Ruby 1.8.7
我正在努力解决递归实例方法中一些奇怪的变量行为。运行Ruby 1.8.7。我这样做是为了学习,我遇到了一些麻烦。如有任何建议,将不胜感激 此代码尝试找出所有不同的方法,您可以使用长度为1英尺、2英尺、3英尺和4英尺的砖块制作一行长度为递归Ruby实例方法中神秘的空数组-Ruby 1.8.7,ruby,recursion,instance-variables,Ruby,Recursion,Instance Variables,我正在努力解决递归实例方法中一些奇怪的变量行为。运行Ruby 1.8.7。我这样做是为了学习,我遇到了一些麻烦。如有任何建议,将不胜感激 此代码尝试找出所有不同的方法,您可以使用长度为1英尺、2英尺、3英尺和4英尺的砖块制作一行长度为max_length 实例方法将块添加到行([0],10)将递归地添加不同长度的块,直到将满足总长度标准的所有可能组合放在一起。我试图将所有不同的砖块组合存储在一个实例变量中,@rows,它是一个数组数组,每个数组表示一行中的一系列砖块 一切正常,只是当我查看实例的
max_length
实例方法将块添加到行([0],10)
将递归地添加不同长度的块,直到将满足总长度标准的所有可能组合放在一起。我试图将所有不同的砖块组合存储在一个实例变量中,@rows
,它是一个数组数组,每个数组表示一行中的一系列砖块
一切正常,只是当我查看实例的行
变量时,它充满了一堆[0]
数组。奇怪的是,当我将@rows.push(row)
更改为@rows.push(row.to)
时,一切正常。这是怎么回事?当我尝试将行数组放入@行中时,为什么行数组变为空?下面是这里描述的两个场景的代码和示例输出
class Array; def sum; inject( nil ) { |sum,x| sum ? sum+x : x }; end; end
class Brick
attr_accessor :rows
def initialize(rows)
@rows = rows
end
def add_brick_to_row(row,max_length)
(1..4).each do |n|
# Add a brick if needed
if row.sum <= max_length
row.push(n)
if row.sum == max_length
# If the row is complete add it to the rows matrix
# BELOW IS THE PROBLEMATIC LINE
@rows.push(row)
# EVERYTHING SEEMS TO WORK FINE WHEN I CHANGE row TO A STRING (SEE NEXT LINE)
# @rows.push(row.to_s)
print "pushed row: "
print row.to_s+"\n"
elsif row.sum < max_length
# Recurse if more bricks are needed
# print "adding brick\n"
self.add_brick_to_row(row, max_length)
end
end
row.pop
end
end
end
病理病例(我有@rows.push(row)
):
问题是您正在将对同一行的多个引用压入行
用以下部件更换推压管:
@rows.push(Array.new(row))
这将为每个行创建一个新的数组实例,应该可以解决您的问题。谢谢brentvatne!这很有道理。
>> l.add_brick_to_row([0],3)
>> l.rows
=> [0, "0111", "012", "021", "03"]
>> l.add_brick_to_row([0],3)
>> l.rows
=> [[0], [0], [0], [0]]