A. 什麼是ε-closure
閉包(Closure)是函數(或方法)及其執行環境的組合體,它不僅包括函數(或方法)本身,也包括函數(或方法)運行時的上下文詞彙環境。閉包是所有動態語言的基石,閉包實現了函數(或方法)可以作為參數傳遞給函數(或方法)。
ε-closure是閉包函數,表示是當前狀態通過ε邊可以到達的所有狀態的集合
集合的ε-closure
就是集合中所有狀態的ε-closure的並集
ε是一個變數。
B. python什麼是閉包 閉包的作用域
簡單說,閉包就是根據不同的配置信息得到不同的結果
再來看看專業的解釋:閉包(Closure)是詞法閉包(Lexical
Closure)的簡稱,是引用了自由變數的函數。這個被引用的自由變數將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法
認為閉包是由函數和與其相關的引用環境組合而成的實體。
python實例
看概念總是讓人摸不著頭腦,看幾個python小例子就會了
def make_adder(addend):
def adder(augend):
return augend + addend
return adder
p = make_adder(23)
q = make_adder(44)
print p(100)
print q(100)
運行結果:
123
144
分析一下:
我們發現,make_adder是一個函數,包括一個參數addend,比較特殊的地方是這個函數裡面又定義了一個新函數,這個新函數裡面的一個變數正好是外部make_adder的參數.也就是說,外部傳遞過來的addend參數已經和adder函數綁定到一起了,形成了一個新函數,我們可以把addend看做新函數的一個配置信息,配置信息不同,函數的功能就不一樣了,也就是能得到定製之後的函數.
再看看運行結果,我們發現,雖然p和q都是make_adder生成的,但是因為配置參數不同,後面再執行相同參數的函數後得到了不同的結果.這就是閉包.
C. 如何理解javascript closure
定義:閉包(closure)就是能夠讀取其他函數內部變數的函數。
javascript語言的特點,由於變數的作用域在函數內部,導致函數外部無法讀取函數內部的變數。
看下面這段代碼,如果要從外部讀取函數內部的變數,會出錯。
functionf1(){
varn=999;
}
alert(n);//error
如果想要讀取函數內部的變數怎麼辦呢?所以就需要閉包,就是一個可以讀取其他函數內部變數的函數。
functionf1(){
varn=999;
functionf2(){
alert(n);
}
returnf2;
}
varresult=f1();
result();//999
把f2作為返回值,就可以在f1外部讀取它的內部變數。
函數f2就是閉包
D. 什麼是閉包,為什麼要用它
一、變數的作用域
要理解閉包,首先必須理解Javascript特殊的變數作用域。
變數的作用域無非就是兩種:全局變數和局部變數。
Javascript語言的特殊之處,就在於函數內部可以直接讀取全局變數。
二、如何從外部讀取局部變數?
出於種種原因,我們有時候需要得到函數內的局部變數。但是,前面已經說過了,正常情況下,這是辦不到的,只有通過變通方法才能實現。
那就是在函數的內部,再定義一個函數。
三、閉包的概念
上一節代碼中的f2函數,就是閉包。
各種專業文獻上的「閉包」(closure)定義非常抽象,很難看懂。我的理解是,閉包就是能夠讀取其他函數內部變數的函數。
由於在Javascript語言中,只有函數內部的子函數才能讀取局部變數,因此可以把閉包簡單理解成「定義在一個函數內部的函數」。
所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
--------------------------------------------------------------------------------------------------------b
四、閉包的用途
閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變數,另一個就是讓這些變數的值始終保持在內存中。
E. 閉包的實質是什麼
閉包(closure)是計算機編程領域的專業名詞,指可以包含自由(未綁定到特定對象)變數的代碼塊,子函數可以使用父函數中的局部變數。閉包源於要執行的代碼塊和為自由變數提供綁定的計算環境(作用域)兩者的結合,Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Lua、objective c 以及Java(Java8及以上)等語言中都能找到對閉包不同程度的支持。
本質
集合 S 是閉集當且僅當 Cl(S)=S(這里的cl即closure,閉包)。特別的,空集的閉包是空集,X 的閉包是 X。集合的交集的閉包總是集合的閉包的交集的子集(不一定是真子集)。有限多個集合的並集的閉包和這些集合的閉包的並集相等;零個集合的並集為空集,所以這個命題包含了前面的空集的閉包的特殊情況。無限多個集合的並集的閉包不一定等於這些集合的閉包的並集,但前者一定是後者的父集。
若 A 為包含 S 的 X 的子空間,則 S 在 A 中計算得到的閉包等於 A 和 S 在 X 中計算得到的閉包(Cl_A(S) = A ∩ Cl_X(S))的交集。特別的,S在 A 中是稠密的,當且僅當 A 是 Cl_X(S) 的子集。
度量空間中的閉包
對歐幾里德空間的子集 S,x 是 S 的閉包點,若所有以 x 為中心的開球都包含 S 的點(這個點也可以是 x)。
這個定義可以推廣到度量空間 X 的任意子集 S。具體地說,對具有度量 d 的度量空間 X,x 是 S 的閉包點,若對所有 r>0,存在 y 屬於 S,使得距離 d(x,y)<r(同樣的,可以是 x = y)。另一種說法可以是,x 是 S 的閉包點,若距離 d(x,S) := inf{d(x,s) : s 屬於 S} = 0(這里 inf 表示下確界)。
這個定義也可以推廣到拓撲空間,只需要用鄰域替代「開球」。設 S 是拓撲空間 X 的子集,則 x 是 S 的閉包點,若所有 x 鄰域都包含 S 的點。注意,這個定義並不要求鄰域是開的。
F. 編譯原理中,LR(0)文法的項目集規范族的I0,I1,I2,I3…………是怎麼求的~
先舉個例子:
}
將其命名為I1。
其他可類似推出。
G. 編譯原理中的閉包是什麼意思,在資料庫中看到過閉包
閉包就是由一個屬性直接或間接推導出的所有屬性的集合,例如:
f={a->b,b->c,a->d,e->f}
由a可直接得到b和d,間接得到c,則a的閉包就是{a,b,c,d}
H. 關於閉包的理解問題,小白求大牛解答!!
首先應該深入的理解一下閉包的概念,維基網路上關於閉包的解釋理解起來比較容易些,我把前面兩段話簡單的處理一下:
在程序語言中,閉包(Closure),又稱詞法閉包(Lexical Closure)或函數閉包(function closures),是引用了自由變數的函數。這個被引用的自由變數將和這個函數一同存在,即使已經離開了創造它的環境也不例外。閉包是由函數和與其相關的引用環境組合而成的實體。
在一些語言中,在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變數,則可能產生閉包。運行時,一旦外部的函數被執行,一個閉包就形成了,閉包中包含了內部函數的代碼,以及所需外部函數中的變數的引用。
理解了閉包之後,再來看你的第一個問題,雖然A處的inc函數只是聲明,但是閉包在外層函數a執行的時候就已經生成,形成的閉包包括了內部函數的代碼和所需外部變數的引用。根據定義,還有一點需要注意,即形成的閉包保存的是外部變數的引用,看下面的例子:
vararr=[];
for(vari=0;i<3;i++){
arr[i]=returnfunction(){
alert(i)
}
}
arr[0]();
arr[1]();
arr[2]();
每次都是彈出3,即閉包只記住外部變數存放在了哪裡,在內部函數還沒有執行前,它是不管你的值是什麼的,任你怎麼變,我執行的時候只獲取最後的值。要想實現想要的效果,可以這樣做:
vararr=[];
for(vari=0;i<3;i++){
arr[i]=function(j){
returnfunction(){
alert(j)
}
}(i)
}
arr[0]();
arr[1]();
arr[2]();
這里用一個立即執行函數,使得每次循環的i值都記錄下來了。
你的第二個問題看了好幾遍還是不太理解你想問什麼,簡單的說一些常識吧。function a(...)和var a=function(...)是函數的兩種聲明方式,無論哪一種,只要你沒有重新給a賦值,即a還指向這個函數,那麼這個函數所佔據的內存就不會被回收,函數執行完畢後回收的只是函數內部聲明的局部變數(如果變數沒有被內部函數引用形成閉包),故而函數的局部變數在函數每次執行時都重新定義,重新賦值。
I. 閉包的實質是什麼
閉包就是能夠讀取其他函數內部變數的函數。例如在javascript中,只有函數內部的子函數才能讀取局部變數,所以閉包可以理解成「定義在一個函數內部的函數「。在本質上,閉包是將函數內部和函數外部連接起來的橋梁。
集合 S 是閉集當且僅當 Cl(S)=S(這里的cl即closure,閉包)。特別的,空集的閉包是空集,X 的閉包是 X。集合的交集的閉包總是集合的閉包的交集的子集(不一定是真子集)。有限多個集合的並集的閉包和這些集合的閉包的並集相等;零個集合的並集為空集,所以這個命題包含了前面的空集的閉包的特殊情況。無限多個集合的並集的閉包不一定等於這些集合的閉包的並集,但前者一定是後者的父集。
若 A 為包含 S 的 X 的子空間,則 S 在 A 中計算得到的閉包等於 A 和 S 在 X 中計算得到的閉包(Cl_A(S) = A ∩ Cl_X(S))的交集。特別的,S在 A 中是稠密的,當且僅當 A 是 Cl_X(S) 的子集。
J. 編譯原理項目集規范族問題GO(I,X)中的X是安什麼順序進行測試的
這個問題本身不太准確。
GO(I,X)是一個轉換函數,它的定義如下:
GO(I,X)中的X是一個文法符號,可以是終結符或非終結符,CLOSURE(J)是J的閉包函數,閉包函數的定義就不多說了。
問題「GO(I,X)中的X是按什麼順序進行測試」,是否可解釋成「X是按出現在產生式中的順序進行測試」