【问题标题】:Converting this recursive algorithm into iterative one将此递归算法转换为迭代算法
【发布时间】:2014-01-02 11:40:58
【问题描述】:

我正在查看这个 stackoverflow 问题:Game of 2/9 (Interview at Facebook)

在其中一个答案中指出,通过与递归解决方案进行比较,可以找到此算法:

def win29(n):
    if n<=9: return True
    n-=1
    while n>=18:
        n = n//18
    return n==1 or 4<=n<=8

我猜递归算法应该是这个:

 F(i, j) = true; if (2^i * 9^j * 9) >= N
       !(F(i+1, j) && F(i, j+1)); otherwise

将这种递归算法转换为上述迭代算法的机制或过程(或比较)是什么?

【问题讨论】:

  • 你的递归算法和上面的算法不一样。
  • 当你调用 F(0,0) 和 n=N 时,它似乎也是一样的。根据我给出的链接,至少它似乎应该给出相同的答案。
  • 说我笨,但是这种伪代码风格真的让我很困惑。这是任何标准,还是事实上的标准。我的意思是n = n//18 ...或if n&lt;=9: return True,但在后一个代码示例中F(i, j) = true; if ...。见鬼?
  • 请看一下我引用的问题。我认为两者的语言(或伪代码)不同。但是很容易理解每​​种算法的作用。

标签: algorithm


【解决方案1】:

这是我可以解释的算法:

  1. N &lt; 18^k*x and x&gt;8 &amp; x&lt;18 : 然后玩家 2 获胜,因为他可以通过使 18 的推杆幂直到 x 仍然存在来强制获胜

  2. N &lt; 18*k*x*9 and x&gt;8 &amp; x&lt;18N&lt;18*k*2*x and x&gt;8 &amp; x&lt;18 :使用与 1 相同的类比。其中玩家 1 进行第 2 步或第 9 步,然后使用 1 获胜。因为他是下一步中的玩家 2。简化两个方程中的余数,我们得到r&gt;=9*8/18&gt;=4 and r&lt;9*18/18&lt;=8 and r&gt;=9*2/18&gt;=1 and r&lt;18*2/18&lt;2 玩家 1 获胜

因此依次除以 18,然后检查 n&gt;=4 and n&lt;=8 or n==1 玩家 1 获胜

如果正确比较我的解释,虽然我是通过另一种方式得出的,但它与递归解决方案相当,其中2^i*9^j*9 可以可视化为18^k*xF(i+1,j) as 2*18^k*xF(i,j+1) as 9*18^k*x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多