递归函数不遵循所有路径

时间:2013-08-27 21:19:30

标签: vb.net algorithm recursion logic

我参与了挑战。

这是给出的问题:

  

这个问题涉及与泰迪熊的比赛。游戏从我开始   给你一些熊。然后你可以回馈一些熊,但你必须   遵循这些规则(其中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

2 个答案:

答案 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