2010-07-20 90 views

回答

4

它可能通過等價的迭代實現重現任何遞歸代碼。

這個問題介紹了這個相當不錯:Is it possible to remove recursion from this function?

+1

這是錯的。所有你需要的是一個堆棧。 進入遞歸調用是在棧上添加數據,然後離開將其刪除。 – Scharron 2010-07-20 15:27:02

+1

事實上,通常情況下你會得到的代碼不如遞歸對應的代碼更優雅,也更難以理解。 – NullUserException 2010-07-20 15:28:08

+0

你基本上是對的。這是我編程課程中的一整章:從遞歸轉換爲迭代。 – 2010-07-20 15:29:15

1

我同意James - 任何遞歸代碼理論上可以使用迭代的方法來實現。在引用的鏈接上描述的堆棧方法是一個有效的選項。另一種方法是,您可以將其深度編碼爲n,然後將其限制爲所述深度的明顯風險。

不知道更多關於您嘗試運行JSON處理代碼的環境和約束條件,很難說哪種方法最適合。有些事情要考慮:

  • 遞歸代碼通常是簡單的跟隨,如果你可以管理(在幾乎任何語言與例99%兼容在那裏處理JSON)使用固定的深度可以
  • 迭代代碼「效率更高」,因爲它不需要太多的堆棧使用,但不能很好地擴展到n深度場景
  • 基於堆棧的代碼可以處理n深度場景,但可能不像其他場景那麼直觀程序員

此外,還可以對樹結構進行線性化(JSON的對象圖是隱含的,假定數組只能有一個「數組」的虛擬根)。這允許採用平坦流處理方法。如果您進一步注入人造代幣(如DOWNUP),它可以非常清晰易讀。這是編譯器設計和語言分析中出現的問題,但這裏可能有助於理解。

相關問題