1

我参与了一项挑战。

这是给出的问题:

这个问题涉及与泰迪熊的游戏。当我给你一些熊时,游戏就开始了。然后你可以回馈一些熊,但你必须遵守这些规则(其中 n 是你拥有的熊的数量):

如果 n 是偶数,那么您可以准确地返还 n/2 个熊。如果 n 可以被 3 或 4 整除,那么您可以将 n 的最后两位数相乘,并归还这么多熊。(顺便说一下,n 的最后一位是 n%10,倒数第二位是 ((n%100)/10)。如果 n 能被 5 整除,那么你可以准确地返回 42 只熊。游戏的目标是最终得到 42 只熊。

例如,假设您从 250 只熊开始。然后你可以做这些动作:

--从 250 只熊开始。

-- 因为 250 可以被 5 整除,所以你可以返回 42 只熊,剩下 208 只熊。

-- 由于 208 是偶数,您可以退回一半的熊,剩下 104 只熊。

-- 由于 104 是偶数,您可以退回一半的熊,剩下 52 只熊。

-- 由于 52 可以被 4 整除,因此您可以将最后两位数相乘(结果为 10)并返回这 10 只熊。这给你留下了 42 只熊。

——你已经达到目标了!

编写一个递归函数来满足这个规范:

bool bears(int n) // Postcondition: A true return value means that it is possible to win // the bear game by starting with n bears. A false return value means that // it is not possible to win the bear game by starting with n bears. // Examples: // bear(250) is true (as shown above) // bear(42) is true // bear(84) is true // bear(53) is false // bear(41) is false

提示:要测试 n 是否为偶数,请使用表达式 ((n % 2) == 0)。

这是我的解决方案,但不幸的是它总是返回错误。我猜它没有遵循整个替代路径,但不知道为什么。顺便说一句,我对 VB 很陌生。提前致谢。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        MsgBox(bear(Int(TextBox1.Text)))
    End Sub
    Public Function bear(bc As Integer) As Boolean
        Dim way1, way2, way3 As Integer
        If bc = 42 Then
            Return True
        ElseIf bc < 42 Then
            Return False
        ElseIf (bc Mod 2 = 0) Or (bc Mod 3 = 0) Or (bc Mod 4 = 0) Or (bc Mod 5 = 0) Then

            If (bc Mod 2 = 0) Then
                way1 = bear(bc / 2)
            End If
            If (bc Mod 3 = 0) Or (bc Mod 4 = 0) Then
                way2 = bear((bc Mod 10) * ((bc Mod 100) / 10))
            End If
            If (bc Mod 5 = 0) Then
                way3 = bear(bc - 42)
            End If
            If (way1 Or way2 Or way3) Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
4

2 回答 2

1

(经过进一步思考,我现在可以看到唯一的问题是下面引用的行..)

.. 等一下,看起来你只需改变一行就可以做到这一点。在 MOD 3 或 4 的情况下,更改此行:

way2 = bear((bc Mod 10) * ((bc Mod 100) / 10))

对这些:

dim gb as Integer
gb = (bc Mod 10) * ((bc Mod 100) / 10)
If gb <= 0 then Return False
way2 = bear(bc - gb)
于 2013-08-27T21:33:48.663 回答
1

最明显的是您正在检查bears(bearsToTake)而不是bears(bearsLeft-bearsToTake). 我认为您也可能会过早返回 false ,但我没有检查过,所以不要引用我的话。

Python 中的解决方案,供后代使用。您不一定需要像其他答案所建议的那样额外的“计数器”值,但使用一个通常是一种好习惯。(我知道你没有使用 Python,但它几乎看起来像伪代码,因此我发现它更容易理解。)

此解决方案与您的解决方案几乎相同 - 它只是将参数从已采取的熊市修正为总熊市!熊熊熊。

>>> def checkBears(n):
...     if n == 42:
...         return True
...     elif n < 42:
...         return False
...     else:
...         if not n % 2 and checkBears(n/2):
...             return True
...         if (not n % 3 or not n % 4) and checkBears(n - n % 10 * (n%100)/10):
...             return True
...         if not n % 5 and checkBears(n - 42):
...             return True
...     return False
... 
>>> checkBears(250)
True
>>> checkBears(53)
False
>>> checkBears(42)
True
>>> checkBears(84)
True
于 2013-08-27T21:49:20.473 回答