c語言的閉包
1. 閉包的語法結構
Groovy的閉包
閉包(Closure)是java所不具備的語法結構(JAVA8增加了對閉包的支持)。閉包就是一個代碼塊,用「{ }」包起來。此時,程序代碼也就成了數據,可以被一個變數所引用(與c語言的函數指針比較類似)。閉包的最典型的應用是實現回調函數(callback)。Groovy的API大量使用閉包,以實現對外開放。閉包的創建過程很簡單,例如:
{ 參數 ->
代碼...
}
參考下面的例子代碼,定義了c1和c2兩個閉包,並對它們進行調用:
def c1 = { println it }
def c2 = { text -> println text }
c1.call(content1) //用call方法調用閉包
c2(content2) //直接調用閉包
「->;」之前的部分為閉包的參數,如果有多個參數,之間可用逗號分割;「->;」之後的部分為閉包內的程序代碼。如果省略了「->;」和它之前的部分,此時閉包中代碼,可以用名為「it」的變數訪問參數。
閉包的返回值和函數的返回值定義方式是一樣的:如果有return語句,則返回值是return語句後面的內容;如果沒有return語句,則閉包內的最後一行代碼就是它的返回值。
2. c語言和java如何實現閉包
標準的C不支持閉包
JAVA 參照這邊
http://www.cnblogs.com/chenjunbiao/archive/2011/01/26/1944417.html
3. 求計算機求解關系R的傳遞閉包 C語言演算法
傳遞閉包,最簡單的技術是採用 【弗洛伊德演算法】
Floyd-Warshall演算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。
Floyd-Warshall演算法的時間復雜度為O(N3),空間復雜度為O(N2)。
Floyd-Warshall演算法的原理是動態規劃。
設Di,j,k為從i到j的只以(1..k)集合中的節點為中間節點的最短路徑的長度。
1.若最短路徑經過點k,則Di,j,k = Di,k,k − 1 + Dk,j,k − 1;
2.若最短路徑不經過點k,則Di,j,k = Di,j,k − 1。
因此,Di,j,k = min(Di,k,k − 1 + Dk,j,k − 1,Di,j,k − 1)。
在實際演算法中,為了節約空間,可以直接在原來空間上進行迭代,這樣空間可降至二維。
代碼請見: