【问题标题】:Recursion involving an Array for Wonky Coins涉及 Wonky Coins 数组的递归
【发布时间】:2015-02-12 20:51:28
【问题描述】:

这是给我的提示:

Catsylvanian 的钱是一个奇怪的东西:他们每个人都有一个硬币 面额(包括零!)。一台摇摇晃晃的零钱机器 Catsylvania 取任何价值 N 的硬币并返回 3 个新硬币, 取值为 N/2、N/3 和 N/4(四舍五入)。

写一个方法wonky_coins(n)返回你的硬币数量 如果你拿走所有非零硬币并继续喂它们,剩下的 回到机器中,直到你只剩下零值硬币。

难度: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 迭代它时对其进行了变异,所以我得到了这个我无法解释的奇怪输出?

我从那以后查看了解决方案并意识到数组使它变得不必要地复杂,但我仍然想知道这里发生了什么??

【问题讨论】:

  • 这是因为您正在展平并在递归循环的基本情况下获取数组的长度。所以 [0,0,0] -> 3 .... 最后一次测试也将失败 wonky_coins(0).should == 1

标签: ruby arrays recursion


【解决方案1】:

这是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]

眼见为实是一个很棒的工具,可以帮助挖掘代码中的怪异之处。

【讨论】:

  • 这太棒了!!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 2017-11-12
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 2013-06-03
  • 2018-04-02
相关资源
最近更新 更多