1. 程式人生 > 其它 >在遞迴函式中因不正確使用公共變數而形成死迴圈

在遞迴函式中因不正確使用公共變數而形成死迴圈

昨天碰到了挺鬱悶的錯誤,我寫的一個遞迴函式,形成了死迴圈。程式碼如下:

'遞迴刪除頻道,引數:頻道ID
Sub DeleteBoard(bid)
    '刪除該頻道所有新聞
    News.DeleteByCondition "BoardID=" & bid
    '刪除該頻道所有子頻道
    Dim bs
    bs = Board.GetList("FartherID=" & bid, false, -, -)
    If IsArray(bs) Then
        For i=LBound(bs) To UBound(bs)
            DeleteBoard bs(i).ID
        Next
    End If
    '刪除該頻道
    Board.Delete bid
End Sub

後來檢查才發現,罪魁禍首就是那個i,它是一個全域性變數。遞迴的時候,在另一次呼叫的時候,會修改它的值……因而,就莫明其妙的形成了死迴圈。修改後程式碼如下:

'遞迴刪除頻道,引數:頻道ID
Sub DeleteBoard(bid)
    '刪除該頻道所有新聞
    News.DeleteByCondition "BoardID=" & bid
    '刪除該頻道所有子頻道
    Dim bs, i
    bs = Board.GetList("FartherID=" & bid, false, -, -)
    If IsArray(bs) Then
        For i=LBound(bs) To UBound(bs)
            DeleteBoard bs(i).ID
        Next
    End If
    '刪除該頻道
    Board.Delete bid
End Sub

增加了i的內部宣告,這樣,就會使用內部的i,而不是全域性的那個。