【问题标题】:Stackoverflow trouble with a BinarySearch in VB 2010VB 2010 中 BinarySearch 的 Stackoverflow 问题
【发布时间】:2011-12-08 16:49:16
【问题描述】:
Public Sub BinarySearch_Surname(ByVal BrownieArray() As Brownie_Structure, ByVal SearchItem As String, ByVal LowInt As Integer, ByVal HighInt As Integer)
    Dim ItemFound As Boolean = False
    Dim SearchFailed As Boolean = False
    Dim Midpoint As Integer = Int((LowInt + HighInt) / 2)

    Try
        If BrownieArray(Midpoint).Surname = SearchItem Then
            ItemFound = True
        Else
            If LowInt >= HighInt Then
                SearchFailed = True
            Else
                If BrownieArray(Midpoint).Surname < SearchItem Then
                    **BinarySearch_Surname(BrownieArray, Midpoint + 1, HighInt, ItemFound)
                Else
                    BinarySearch_Surname(BrownieArray, LowInt, Midpoint - 1, HighInt)**
                End If
            End If
        End If
        If SearchFailed = True Then
            MessageBox.Show("Failed to find Suranme in database", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If
        If ItemFound = True Then
            MessageBox.Show("Surname: " & BrownieArray(Midpoint).Surname, "Found", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Exit Sub
        End If
    Catch
        MessageBox.Show("Failed to find , please insert correct infomation and try again", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        Exit Sub
    End Try
End Sub

这种递归算法会出现StackOverflow,我知道为什么会导致错误但不知道如何解决?

【问题讨论】:

  • 请添加 BinarySearch_Surname() 的 Header 以便我们查看参数。但是您正在以一种似乎不是“中间”的方式更改 MidPoint。
  • 使用 Array.BinarySearch() 或 [homework] 标签。

标签: database vb.net algorithm recursion stack-overflow


【解决方案1】:

这一行:

If LowInt >= HighInt Then

应该是:

If LowInt > HighInt Then

这一行:

BinarySearch_Surname(BrownieArray, Midpoint + 1, HighInt, ItemFound)

应该是:

BinarySearch_Surname(BrownieArray, SearchItem, Midpoint + 1, HighInt)

这一行:

BinarySearch_Surname(BrownieArray, LowInt, Midpoint - 1, HighInt)

应该是:

BinarySearch_Surname(BrownieArray, SearchItem, LowInt, Midpoint - 1)

【讨论】:

  • 对不起这仍然不起作用,我仍然不知道为什么?能否请您再看一遍谢谢。
【解决方案2】:

你给递归调用传递了错误的参数,应该是这样的:

  If BrownieArray(Midpoint).Surname < SearchItem Then
      BinarySearch_Surname(BrownieArray, SearchItem, Midpoint + 1, HighInt)
  Else
      BinarySearch_Surname(BrownieArray, SearchItem, LowInt, Midpoint - 1)                
  End If

你的递归退出条件也是错误的,应该是:

  If LowInt > HighInt Then // > instead of >=

此外,您可以将 SUB 转换为返回值的函数,这样您就可以将这些消息框排除在搜索代码之外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2017-11-29
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多