2010-03-24 40 views
9

是這發麪:去和不要去!證明了這一點:

每個算法一個使用去之類的東西,是等價到另一種算法不使用去設計。

換句話說

每個算法使用轉到設計,可以在不使用去進行設計。

如何證明?

+1

證據是:你可以實現一個通用圖靈機無需轉到的,你可以實現一個通用圖靈機和代表其輸入的字符串的任何算法。 – jkff 2010-03-24 13:01:24

+1

'goto'功能可以引入「多個入口循環」,也稱爲「不可約」循環。消除不可約循環本質上是通過複製代碼來實現的。爲的討論(http://moss.csc.ncsu.edu/~mueller/ftp/pub/mueller/papers/europar01.ps.gz):見[優化節點分裂與DJ-圖形處理不可約循環]這方面可以完成。 – 2010-03-24 07:27:39

回答

18

C.伯姆,G Jacopini的,「流程圖,圖靈機和語言只有兩個形成規則」,通訊。 ACM,9(5):366-371,1966。

http://en.wikipedia.org/wiki/Structured_program_theorem

http://en.wikipedia.org/wiki/P"

玻姆 - Jacopini的證據說明了如何構造一個結構化的流程圖從任意的圖表中,使用一個額外的整數變量的比特來跟蹤信息的原始程序表示由程序位置決定。這種結構是基於Böhm的編程語言P「'。 Böhm-Jacopini證明並沒有解決是否採用結構化編程來進行軟件開發的問題,部分原因是這種結構更容易模糊程序而不是改進它。相反,它標誌着辯論的開始。 Edsger Dijkstra的着名信函「Go To Statement Considered Harmful」,於1968年出版。隨後證明了該定理解決了Böhm-Jacopini證明的實際缺點,其結構保持或改進了原始程序的清晰度。 1

+0

http://en.wikipedia.org/wiki/Structured_programming也是一篇不錯的文章。 – 2010-03-24 07:34:16

+1

具有諷刺意味的部分是:當你編譯它時,它會變成大量的gotos(或者是在Assembly中調用的jmp語句) – Toad 2010-03-24 07:58:59

+5

@reinier:諷刺的是它偶爾會導致像「函數調用goto,所以如果我在我的代碼中使用無限制的goto就好了「,或者」功能X只是轉到,不要使用它「。 goto的困難與機器碼無關,結構化編程可以讓代碼更容易。在大多數編譯語言中,'jmp'不等同於goto,因爲goto不僅僅是一個jmp,它通常還需要某種同步才能使堆棧進入目標的正確狀態。 C中的goto'是一個相當高級的編程結構;-) – 2010-03-24 11:40:23

-2

每一個計算機程序可能沒有分支表示。你需要一個無限長的程序,但它可以完成。 (你仍然需要一個if語句)我想這就是你得到你的正式證明的地方。 http://www.jucs.org/jucs_2_11/conditional_branching_is_not/Rojas_R.html

此外,您可以轉到的任何代碼塊都可以分離出來並放置在狀態機或重複循環中。如果你用一個隨機的(和重疊的goto語句)填充的代碼塊,那麼每個goto點可以被分配給一個特定的函數,並且每個轉到可以被替換爲一個function_exit和一個下一個狀態的賦值。

所以

Point1: 
    do something 
Point2: 
    do something 
    if blah goto point3 
    goto point4 
point3: 
    something 
point4: 
    goto point2: 
end 

can be replaced by 

function point1 
    do something 
    return = point2 
end_function 

function point2 
    do something 
    if blah return = point3 
    return = point4 
end_function 

function point3 
    something 
    return = point4 
end_function 

function point4 
    return = point2 
end_function 

state = point1 
repeat 
    state = call_function (state) 
until (state=end) 

這完全模擬轉到不使用goto語句,也正因爲如此,我會回答 - 是的。

我不知道轉到哪裏goto語句點可以是一個變量。

+0

即使強硬我認爲這是正確的。我不確定這是一臺狀態機,所以您可能需要更正我的語言。自學 - 所以,你知道...... :-) – seanyboy 2010-03-24 07:39:54

+4

「你需要一個無限長的程序,但它可以完成」。這是另一種說「不能做」的方式。我們實際使用的所有計算模型都將程序定義爲有限的,包括圖靈機。 – 2010-03-24 11:43:37