c語言,python實現漢諾塔,關於閉包的思考

2021-08-17 23:05:13 字數 1608 閱讀 2204

最簡單的漢諾塔實現就是遞迴,比如c語言的實現:

void move(char a,int n,char c)

void hanoi(int n,char a,char b,char c)

}

但是如果想給move函式列印的時候追加序號來顯示移動盤子是第幾次操作,則需要乙個單獨的變數用於計數,手頭一本教材上非常簡單的設定了乙個全域性變數,並把變數置於move函式中自增長。

所以在單執行緒程式裡面,多次呼叫hanoi(int n,char a,char b,char c),就得重置這個全域性變數。

int m=0;

void move(char a,int n,char c)

void hanoi_(int n,char a,char b,char c)

}void hanoi(int n,char a,char b,char c)

void inithanoi()

在多執行緒程式中這個**必定會出現問題的,如果給m加鎖,它就和單執行緒沒有區別了。這個問題最簡單的處理方法就是閉包,讓變數m只被hanoi(int n,char a,char b,char c)訪問的到,外部不能訪問,並且每次呼叫它得到的m只是乙個副本,它們的資料不會相互影響。

然而谷歌的結果是c語言不能像python那樣的方法實現閉包,一定要寫也可以,那是蘋果公司在clang上面加上的閉包特性,只有clang編譯器支援,clang的寫法是不通用的。

python的閉包實現:

def hanoi(n,a,b,c):

m=0def move(a,n,c):

nonlocal m

m+=1

print("[%d]%d,%c,%c" %(m,n,a,c))

def hanoi_(n,a,b,c):

if n==1:

move(a, 1, c)

else:

hanoi_(n - 1, a, c, b)

move(a, n, c)

hanoi_(n - 1, b, a, c)

hanoi_(n,a,b,c)//閉包其實要寫成 return hanoi_,只是這裡只需要呼叫一次

其實想想,c語言也能寫出類似閉包的寫法,只是要傳引數而已:

void move(char a,int n,char c,int &m)

void hanoi_(int n,char a,char b,char c,int &m)

}void hanoi(int n,char a,char b,char c)

有點閉包的味道了,23333333

我這些寫法並不是完整嚴格的閉包概念,不過閉包目前對我而言只是不去給變數加鎖的偷懶方法而已,先這樣吧。

閉包定義的討論:

根據該文章的說法,閉包和返回函式也沒有必然關係,看來也只是一種形式而已,閉包的有一層意義是函式執行完成之後,它的成員變數不會被**,因為這個變數要給函式返回的函式去執行。而我只是用了它另乙個作用,每次呼叫函式,內部函式相當於使用的是外部變數的副本,這樣就能避免資料相互影響,這也是類似一種包啊。

為了寫閉包而閉包是沒有必要的,要關注的是閉包的實際服務作用,按實際需要而寫。

python 漢諾塔 Python漢諾塔

import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...

Python實現漢諾塔

原始碼 move n,a,b,c 這個函式不要理解為abc三個柱子。請這樣理解,move函式,用來完成這麼乙個任務 把n個盤子,從 源柱 通過 過渡柱 移動到 目標柱 上。即move n,source,bridge,destination 為了完成這個任務,需要將此母任務分解為三個子任務 1.把 源...

漢諾塔python實現

def hanoi height,left,center,right 漢諾塔,將高為height的塔從left借助center移到right if height1 一層漢諾塔,直接從left到right print 第 層 從 format height,left,right else 大於等於兩層...