我参与了挑战。
这是给出的问题:
这个问题涉及与泰迪熊的比赛。游戏从我开始 给你一些熊。然后你可以回馈一些熊,但你必须 遵循这些规则(其中n是您拥有的熊数):
如果n是偶数,那么你可以准确地回馈n / 2只熊。如果是 可以被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)。
这是我的解决方案,但不幸的是它总是返回false。我想它不是遵循整个替代路径但不知道为什么。顺便说一句,我对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
答案 0 :(得分: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)
答案 1 :(得分:1)
最明显的是,您正在检查bears(bearsToTake)
而不是bears(bearsLeft-bearsToTake)
。我想你也可能过早地回归假,但我没有检查过,所以不要引用我。
Python的解决方案,适用于后代。您不一定需要额外的“计数器”值,就像其他答案所暗示的那样,但通常使用一个很好的做法。 (我知道你没有使用Python,但它几乎看起来像psuedocode,因此我发现它更容易理解。)
此解决方案几乎与您的解决方案相同 - 它只是将参数从拍摄的熊中修复为总熊数!熊熊熊。
>>> 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