我参与了一项挑战。
这是给出的问题:
这个问题涉及与泰迪熊的游戏。当我给你一些熊时,游戏就开始了。然后你可以回馈一些熊,但你必须遵守这些规则(其中 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