閱讀下面的**,它的輸出結果是什麼?
class node(object):
def __init__(self,sname):
self._lchildren =
self.sname = sname
def __repr__(self):
return "".format(self.sname)
def print_all_1(self):
print self
for ochild in self._lchildren:
ochild.print_all_1()
def print_all_2(self):
def gen(o):
lall = [o,]
while lall:
onext = lall.pop(0)
lall.extend(onext._lchildren)
yield onext
for onode in gen(self):
print onode
oroot = node("root")
ochild1 = node("child1")
ochild2 = node("child2")
ochild3 = node("child3")
ochild4 = node("child4")
ochild5 = node("child5")
ochild6 = node("child6")
ochild7 = node("child7")
ochild8 = node("child8")
ochild9 = node("child9")
ochild10 = node("child10")
# 說明下面**的輸出結果
oroot.print_all_1()
oroot.print_all_2()
答案oroot.print_all_1()會列印下面的結果:
oroot.print_all_1()會列印下面的結果:
為什麼提這個問題?
因為物件的精髓就在於組合(composition)與物件構造(object construction)。物件需要有組合成分構成,而且得以某種方式初始化。這裡也涉及到遞迴和生成器(generator)的使用。
生成器是很棒的資料型別。你可以只通過構造乙個很長的列表,然後列印列表的內容,就可以取得與print_all_2類似的功能。生成器還有乙個好處,就是不用佔據很多記憶體。
有一點還值得指出,就是print_all_1會以深度優先(depth-first)的方式遍歷樹(tree),而print_all_2則是寬度優先(width-first)。有時候,一種遍歷方式比另一種更合適。但這要看你的應用的具體情況。
資料結構演算法題 判斷乙個數字是否是回文數
題目大意 判斷乙個數字是否是回訪字數,不要使用額外的空間。解題思路 先逆序然後判斷是否相等 為了不使用額外的空間,參考了其它的解決,那些解法看起來在ispalindrome方法中沒有使用額外引數,但是卻使用了方法呼叫,這個比乙個整數消耗的空間更多 並沒有達到題目的要求,是假的實現,所以本題依然採用乙...
資料結構 乙個陣列實現兩個棧
乙個陣列實現兩個棧有很多想法,我先寫一種比較簡單的,思路如下圖所示 如下 includeusing namespace std 乙個陣列實現兩個棧 template class arraystack void pusharray1 const t x else cout 該棧已滿 0 else co...
資料結構 乙個陣列實現兩個堆疊
1 如何判斷棧滿?棧滿的判斷可以根據兩個棧頂之間的距離來判斷,當棧滿時必然存在top2 top1 1。int isfull stack s 2 從陣列頂端壓棧,棧頂是減1 從陣列底部壓棧,棧頂是加1 3 從陣列頂端出棧,棧頂是加1 從陣列底部出棧,棧頂是減1 c語言實現 include includ...