我遇到了一个挑战。
以下是给出的问题:
这个问题涉及一个与泰迪熊的游戏。当我
给你一些熊。你可以还一些熊,但你必须
遵循这些规则(其中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
最佳答案
(经过进一步思考,我现在可以看到,唯一的问题是下面引用的行..)
.. 等等,看来你只要换一条线就行了。在MOD 3或MOD 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)