涉及 Wonky Coins 数组的递归
Recursion involving an Array for Wonky Coins
这是我得到的提示:
Catsylvanian 的钱是个奇怪的东西:他们每人有一枚硬币
面额(包括零!)。一个不稳定的改变机器
Catsylvania 拿取任何价值 N 的硬币和 returns 3 个新硬币,
值为 N/2、N/3 和 N/4(向下舍入)。
写一个方法wonky_coins(n)
,returns你的硬币数量
如果你拿走所有非零硬币并继续喂它们
回到机器,直到你只剩下零价值的硬币。
难度:3/5
describe "#wonky_coins" do
it "handles a simple case" do
wonky_coins(1).should == 3
end
it "handles a larger case" do
wonky_coins(5).should == 11
# 11
# => [2, 1, 1]
# => [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
# => [[[0, 0, 0], 0, 0], [0, 0, 0], [0, 0, 0]]
end
it "handles being given the zero coin" do
wonky_coins(0).should == 1
end
end
也许是因为给定的测试涉及数组,但我无法忘记它们!所以到目前为止我的解决方案如下:
def wonky_coins(n)
arr = []
arr << n/2 << n/3 << n/4
#base case?
if arr.all?{|coin| coin == 0}
return arr.flatten.length
else
arr.map{|x| wonky_coins(x)}
end
end
p wonky_coins(5)
除非我将 [[3,3,3],3,3] 映射为输出。它实际上并没有重复出现,但即使在那之前,它也给出了一个奇怪的输出,我一辈子都无法理解为什么输出是这样的!
我知道这是因为我正在使用 map 方法,是不是因为我在再次通过 wonky_coins 迭代它时对其进行了变异,所以我得到了这个我无法解释的奇怪输出?
从那以后我查看了解决方案并意识到数组使它不必要地变得复杂,但我仍然想知道这里发生了什么??
下面是代码运行时 Seeing is Believing 显示的内容:
def wonky_coins(n)
arr = [] # => [], [], [], [], [], [], []
arr << n/2 << n/3 << n/4 # => [2, 1, 1], [1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]
#base case?
if arr.all?{|coin| coin == 0} # => false, false, true, true, true, true, true
return arr.flatten.length # => 3, 3, 3, 3, 3
else
arr.map{|x| wonky_coins(x)} # => [3, 3, 3], [[3, 3, 3], 3, 3]
end
end
p wonky_coins(5) # => [[3, 3, 3], 3, 3]
# >> [[3, 3, 3], 3, 3]
眼见为实是一个很棒的工具,可以帮助挖掘代码中的怪异之处。
这是我得到的提示:
Catsylvanian 的钱是个奇怪的东西:他们每人有一枚硬币 面额(包括零!)。一个不稳定的改变机器 Catsylvania 拿取任何价值 N 的硬币和 returns 3 个新硬币, 值为 N/2、N/3 和 N/4(向下舍入)。
写一个方法wonky_coins(n)
,returns你的硬币数量
如果你拿走所有非零硬币并继续喂它们
回到机器,直到你只剩下零价值的硬币。
难度:3/5
describe "#wonky_coins" do
it "handles a simple case" do
wonky_coins(1).should == 3
end
it "handles a larger case" do
wonky_coins(5).should == 11
# 11
# => [2, 1, 1]
# => [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
# => [[[0, 0, 0], 0, 0], [0, 0, 0], [0, 0, 0]]
end
it "handles being given the zero coin" do
wonky_coins(0).should == 1
end
end
也许是因为给定的测试涉及数组,但我无法忘记它们!所以到目前为止我的解决方案如下:
def wonky_coins(n)
arr = []
arr << n/2 << n/3 << n/4
#base case?
if arr.all?{|coin| coin == 0}
return arr.flatten.length
else
arr.map{|x| wonky_coins(x)}
end
end
p wonky_coins(5)
除非我将 [[3,3,3],3,3] 映射为输出。它实际上并没有重复出现,但即使在那之前,它也给出了一个奇怪的输出,我一辈子都无法理解为什么输出是这样的!
我知道这是因为我正在使用 map 方法,是不是因为我在再次通过 wonky_coins 迭代它时对其进行了变异,所以我得到了这个我无法解释的奇怪输出?
从那以后我查看了解决方案并意识到数组使它不必要地变得复杂,但我仍然想知道这里发生了什么??
下面是代码运行时 Seeing is Believing 显示的内容:
def wonky_coins(n)
arr = [] # => [], [], [], [], [], [], []
arr << n/2 << n/3 << n/4 # => [2, 1, 1], [1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]
#base case?
if arr.all?{|coin| coin == 0} # => false, false, true, true, true, true, true
return arr.flatten.length # => 3, 3, 3, 3, 3
else
arr.map{|x| wonky_coins(x)} # => [3, 3, 3], [[3, 3, 3], 3, 3]
end
end
p wonky_coins(5) # => [[3, 3, 3], 3, 3]
# >> [[3, 3, 3], 3, 3]
眼见为实是一个很棒的工具,可以帮助挖掘代码中的怪异之处。