在遞迴函式中因不正確使用公共變數而形成死迴圈
阿新 • • 發佈:2022-05-04
昨天碰到了挺鬱悶的錯誤,我寫的一個遞迴函式,形成了死迴圈。程式碼如下:
'遞迴刪除頻道,引數:頻道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,而不是全域性的那個。