VB递归堆栈溢出,高手改下
第一次递归没问题,第二次递归就出错了。PrivateFunctionw(ByValstr1AsString,ByValstr2AsString)AsStringDimi,...
第一次递归没问题,第二次递归就出错了。
Private Function w(ByVal str1 As String, ByVal str2 As String) As String
Dim i, j, k As Integer
Dim jishu As Integer
Dim x1(), y1() As String
ReDim y1(UBound(a, 2))
If bl = False Then
For i = 0 To UBound(str) - 1
If str(i) = str1 Then Exit Function '碰到已经递归过的站点退出递归
Next
End If
'获取str1站点下的所有线路
For i = 0 To UBound(a, 1)
For j = 1 To UBound(a, 2)
If a(i, j) = str1 Then
ReDim Preserve x1(jishu)
x1(jishu) = a(i, 0)
jishu = jishu + 1
Exit For
End If
Next
Next
'把数组x站点下所有线路的路线搜索出来,看看能否到达str2站点
For k = 0 To UBound(x1)
'---------------------------------
For i = 0 To UBound(a, 1)
If a(i, 0) = x1(k) Then
For j = 1 To UBound(a, 2)
If a(i, j) = str2 Then '找到则退出递归
bl = True
Exit Function
Else '没找到继续递归
ReDim str(num2)
str(num2) = a(i, j)
num2 = num2 + 1
w = w & "——" & w(a(i, j), str2) '换乘路线
End If
If bl = True Then Exit Function
Next
End If
Next
'---------------------------------
Next
End Function 展开
Private Function w(ByVal str1 As String, ByVal str2 As String) As String
Dim i, j, k As Integer
Dim jishu As Integer
Dim x1(), y1() As String
ReDim y1(UBound(a, 2))
If bl = False Then
For i = 0 To UBound(str) - 1
If str(i) = str1 Then Exit Function '碰到已经递归过的站点退出递归
Next
End If
'获取str1站点下的所有线路
For i = 0 To UBound(a, 1)
For j = 1 To UBound(a, 2)
If a(i, j) = str1 Then
ReDim Preserve x1(jishu)
x1(jishu) = a(i, 0)
jishu = jishu + 1
Exit For
End If
Next
Next
'把数组x站点下所有线路的路线搜索出来,看看能否到达str2站点
For k = 0 To UBound(x1)
'---------------------------------
For i = 0 To UBound(a, 1)
If a(i, 0) = x1(k) Then
For j = 1 To UBound(a, 2)
If a(i, j) = str2 Then '找到则退出递归
bl = True
Exit Function
Else '没找到继续递归
ReDim str(num2)
str(num2) = a(i, j)
num2 = num2 + 1
w = w & "——" & w(a(i, j), str2) '换乘路线
End If
If bl = True Then Exit Function
Next
End If
Next
'---------------------------------
Next
End Function 展开
3个回答
展开全部
这是DFS吗?如果空间宽裕,改成BFS试试看。不宽裕的话还是多剪枝吧,或者估价一下,从可能最优的解到可能最劣的解扩展搜索树。
如果是在找最短路,那就用Bellman-Ford或SPFA试试看。
不过
w = w & "——" & w(a(i, j), str2)
这个语句行为比较奇怪呃
如果是在找最短路,那就用Bellman-Ford或SPFA试试看。
不过
w = w & "——" & w(a(i, j), str2)
这个语句行为比较奇怪呃
更多追问追答
追问
我做的是一个公交换乘的程序。
从A到D,无法直接达到,换乘。
A问自己下面的所有公交线路,你们谁能到达D,都不能,再B问,还不行,直到找到路线,或遇到已经算过的线路退出递归,再C问。
w = w & "——" & w(a(i, j), str2)
我写错了。是"——" & w(a(i, j), str2),表示换乘搜索。最后的结果是A——B——C——D
结果才递归了两次就堆栈溢出。
追答
懂了,最少换乘吗?那就用广度优先搜索吧,深度优先搜索很不适合这个问题的。
我觉得你描述的思想有问题。
应该这样考虑如何找到路:
从起点站开始,然后沿着所有经过起点的路线往下找,如果能到终点站那就结束,否则把线路上所有点入队,然后依次作为起点再找,直到所有的点都遍历过或者达到终点站为止。同时要记录前驱的。
展开全部
Public Function MyHex(ByVal n As Integer) As String
Dim x As Integer
Dim s As String
Do While n <> 0
x = n Mod 16
s = IIf(x < 10, x, Chr(x + 55)) & s
n = n \ 16
Loop
MyHex = s
End Function
递归的解法
Public Function MyHex2(ByVal n As Integer) As String
If n < 16 Then
MyHex2 = IIf(n < 10, n, Chr(n + 55))
Else
m = n Mod 16
MyHex2 = MyHex2(n \ 16) & IIf(m < 10, m, Chr(m + 55))
End If
End Function
Dim x As Integer
Dim s As String
Do While n <> 0
x = n Mod 16
s = IIf(x < 10, x, Chr(x + 55)) & s
n = n \ 16
Loop
MyHex = s
End Function
递归的解法
Public Function MyHex2(ByVal n As Integer) As String
If n < 16 Then
MyHex2 = IIf(n < 10, n, Chr(n + 55))
Else
m = n Mod 16
MyHex2 = MyHex2(n \ 16) & IIf(m < 10, m, Chr(m + 55))
End If
End Function
追问
答非所问。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
For i = 0 To UBound(str) - 1中的str没有定义。
追问
堆栈溢出跟变量有没有定义有什么关系?这些变量我在声明部分都定义了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询