Vb.net 如何重写此递归函数以删除递归?

Vb.net 如何重写此递归函数以删除递归?,vb.net,recursion,Vb.net,Recursion,我得到了那个小函数(我更改了变量的名称) 我想重写它,这样它就只有循环,没有递归,我现在迷路了,任何人都可以给我一些方向或任何东西吗 编辑它的功能。(英语不是我的母语对不起) 我将向这个函数传递一个类(found的起始值为false),以了解它是否链接到树的中间 该类得到了一个最多有4个链接到其他类的数组,它可以是循环的(这就是为什么我有一个选中的链接布尔值) 它执行递归,直到没有更多的链接(返回false)要检查,或者直到找到中间链接(返回true) 编辑 例如,这个 在pos 0中获得了与1

我得到了那个小函数(我更改了变量的名称)

我想重写它,这样它就只有循环,没有递归,我现在迷路了,任何人都可以给我一些方向或任何东西吗

编辑它的功能。(英语不是我的母语对不起)

我将向这个函数传递一个类(found的起始值为false),以了解它是否链接到树的中间

该类得到了一个最多有4个链接到其他类的数组,它可以是循环的(这就是为什么我有一个选中的链接布尔值)

它执行递归,直到没有更多的链接(返回false)要检查,或者直到找到中间链接(返回true)

编辑

例如,这个

在pos 0中获得了与1的链接
在pos 0中获得了与6的链接
在pos 1中获得了与0的链接
在pos 1中获得了与7的链接
在pos 2中获得了与3的链接
在pos 2中获得了与8的链接
在pos 3中获得了与4的链接
在pos 3中获得了与2的链接
在pos 4中,获得了与3的链接
在pos 5中获得了与11的链接
在pos 6中,获得了与0的链接
在pos 7中获得了与8的链接
在pos 7中,获得了与1的链接
在pos 8中,获得了与9的链接
在pos 8中,获得了与2的链接
在pos 8中,获得了与7的链接
在pos 8中,获得了与14的链接
在pos 9中,获得了与8的链接
在pos 10中获得了与11的链接
在pos 10中获得了与16的链接
在pos 11中,获得了与5的链接
在pos 11中,获得了与10的链接
在pos 11中获得了与17的链接
在pos 12中获得了与13的链接
在pos 13中获得了与12的链接
在pos 13中获得了与19的链接
在pos 14中获得了与15的链接
在pos 14中,获得了与8的链接
在pos 14中获得了与20的链接
在pos 15中,获得了与14的链接
在pos 16中,获得了与10的链接
在pos 16中获得了与22的链接
在pos 17中获得了与11的链接
在pos 18中获得了与19的链接
在pos 18中获得了与24的链接
在pos 19中获得了与20的链接
在pos 19中获得了与13的链接
在pos 19中获得了与18的链接
在pos 19中获得了与25的链接
在pos 20中获得了与21的链接
在pos 20中获得了与14的链接
在pos 20中获得了与19的链接
在pos 20中获得了与26的链接
在pos 21中获得了与20的链接
在pos 22中获得了与23的链接
在pos 22中获得了与16的链接
在pos 22中获得了与28的链接
在pos 23中获得了与22的链接
在pos 23中获得了与29的链接
在pos 24中获得了与18的链接
在pos 25中获得了与19的链接
在pos 26中获得了与27的链接
在pos 26中获得了与20的链接
在pos 27中获得了与28的链接
在pos 27中获得了与26的链接
在pos 28中获得了与22的链接
在pos 28中获得了与27的链接
在pos 29中,获得了与23的链接

中间点是15号位置

上面的代码可以证明每个位置都可以链接到中间点

所以初始参数应该是

  everythingLinked(random pos, false)

在这种情况下,它总是正确的

我可以把它搞糟,但是下面的内容应该会删除递归。基本上,您需要跟踪当前myClass实例,然后移动到下一个实例

found = false
current = firstObj
While Not Found
  For i = 0 To myClass.numLink  
    If myClass.checked_link(i) = False Then 
      myClass.checked_link(i) = True 
      found = myClass.isMiddlePoint
    Else
      // looked through all items and need to break?
      Exit While
    End If 
  Next 

  current = masterArrayOfCls(myClass.linkNum(i))
WEnd

您需要在其中添加一个条件,以确保不会永远循环,可能在“If myClass.checked_link(i)=False”中添加一个else条件,该条件表示您搜索了整个集合,需要跳出循环。

我可以将此操作搞糟,但类似下面的操作应该会删除递归。基本上,您需要跟踪当前myClass实例,然后移动到下一个实例

found = false
current = firstObj
While Not Found
  For i = 0 To myClass.numLink  
    If myClass.checked_link(i) = False Then 
      myClass.checked_link(i) = True 
      found = myClass.isMiddlePoint
    Else
      // looked through all items and need to break?
      Exit While
    End If 
  Next 

  current = masterArrayOfCls(myClass.linkNum(i))
WEnd

您需要在其中添加一个条件,以确保不会永远循环,可能在“If myClass.checked_link(i)=False”中添加一个else条件,表示您搜索了整个集合,需要打破循环。

查看此问题的细节,这里有一些想法可能会有所帮助

您说过最多有4个链接,您需要做的第一件事是确定树的中间位置。因此,如果有<2个链接,则不存在“中间链接”。因此,我们的想法是,您只关心在传递的类中是否有3或4个链接

应该是这样的:

如果(numLinks>=3){
查看数组[2]和/或数组[3]
如果(isFound==true){

//用它做点什么

看看这个问题的细节,这里有一些想法可能会有所帮助

你说过最多有4个链接,你需要做的第一件事是确定树的中间位置。因此,如果有<2个链接,那么就没有“中间”。因此,你的想法是,你只关心传递的类中是否有3或4个链接

应该是这样的:

如果(numLinks>=3){
查看数组[2]和/或数组[3]
如果(isFound==true){

//用它做点什么

一般来说,通过自己实现堆栈,递归例程可以被非递归例程取代


在通常进行递归调用的地方,将通常传递给递归函数的参数推送到堆栈上。然后继续循环。当到达递归的底部时,弹出所需的数据并继续下一个路径。当堆栈为空时,就完成了。

在一般意义上,递归通过自己实现堆栈,可以将e例程替换为非递归例程


在通常进行递归调用的地方,将通常传递给递归函数的参数推送到堆栈上。然后继续循环。当到达递归的底部时,弹出所需的数据并继续下一个路径。当堆栈为空时,就完成了。

在我看来,您有一个图中,您正在执行深度优先搜索,以查找从特定节点到作为中间点的节点的路径

如果我理解正确,您不需要进行
检查
Friend Function everythingLinked(ByVal myClass As cls) As Boolean
    Dim q As New Queue(Of cls)(_clsCount)
    Dim found = False

    myClass.checked_link = true
    found = myClass.isMiddlePoint
    q.Enqueue(myClass)

    While Not found AndAlso q.Count > 0
        Dim p = q.Dequeue
        For i = 0 To p.numLink
            If Not found AndAlso masterArrayOfCls(myClass.linkNum(i)).checked_link = false Then
                masterArrayOfCls(myClass.linkNum(i)).checked_link = true
                found = masterArrayOfCls(myClass.linkNum(i)).isMiddlePoint
                q.Enqueue(masterArrayOfCls(myClass.linkNum(i)))
            End If
        Next
    End While
    q.Clear()

    Return found
End Function