邁克爾的回答解釋了你可能應該解決問題的方式,但他沒有解釋你目前的嘗試有什麼問題。據我瞭解,您的策略是檢查每個節點,並隨時跟蹤最低值,使用遞歸查找所有節點。一旦你檢查了所有的節點,你就知道結果是整個樹的最小值。這是一個非常有效的方法,除非參數不像你期望的那樣工作,否則它會奏效。
Python通過值傳遞參數,而不是通過引用。當使用「min_t = root.key」爲min_t賦值時,它只在函數內部生效。函數的調用者沒有看到新的值。
你可以用一些簡單的代碼測試:
def add_one_to(x):
x = x + 1
print "add_one_to", x
x = 2
add_one_to(x)
print x
當您運行X上的功能裏面,但沒有在頂級水平遞增的代碼可以看到。
這也適用於函數自己調用時。每個調用都有自己的一組局部變量,並且分配給函數內的局部變量不會影響調用它的實例。
請注意,某些語言確實允許您通過引用傳遞參數。如果您通過引用傳遞參數,則在函數內部分配該參數也會影響調用者。如果Python是這些語言之一,你可以使min_t成爲引用參數,並且你的函數可以正常工作。
儘管Python不直接支持引用參數,但您也可以將引用參數看作是在調用函數時進入函數的值,並且在函數完成時還將其傳回給調用方。你可以分開做這兩件事。要將值傳回給調用者,請返回該值。調用者然後可以將該函數分配給它的本地,並且基本上通過引用傳遞了一個參數。
這裏是你如何可以申請是上面的例子:
def add_one_to(x):
x = x + 1
print "add_one_to", x
return x
x = 2
x = add_one_to(x)
print x
只需添加一個返回值和分配,和它的作品,因爲它應該。
你也可以將此你原來的功能:
def min(root, min_t): # min_t is the initially the value of root
if not root:
return min_t
if root.key < min_t:
min_t = root.key
min_t = min(root.left, min_t)
min_t = min(root.right, min_t)
return min_t
我所做的只是在每次調用前加上「min_t =」到MIN()和改變你的return語句在年底返回min_t。 (我認爲你可能意思是返回min_t,min是你函數的名字,所以這沒什麼意義。)我相信這個版本會起作用。
編輯:儘管如此,你的min_tree函數工作的原因是n是一個列表,列表是可變對象。當我在談論上面的「價值」時,我真正的意思是「對象」。 python中的每個變量名稱映射到一個特定的對象。如果你有這樣的代碼:
def replace_list(x):
x = [1, 2, 3]
x = [2]
replace_list(x)
print x
結果是[2]。所以,如果你用「x =」給x賦一個新的值,調用者就不會看到它。但是,如果這樣做:
def replace_list(x):
x.append(1)
x = [2]
replace_list(x)
print x
結果是[2,1]。這是因爲你沒有改變x的值; x仍指向相同的列表。但是,該列表現在包含一個附加值。不幸的是,「+ =」操作符在這方面令人困惑。你可能會認爲「x + = y」與「x = x + y」相同,但在Python中並不總是這樣。如果「x」是一種支持「+ =」的對象,那麼該操作將修改對象。否則,它將與「x = x + 1」相同。列表知道如何處理「+ =」,所以在列表中使用+ =會對其進行修改,但將其與數字一起使用則不會。
實際上,你可以測試這個而不做任何函數調用:
x = [1, 2]
y = x
y += [3]
print x # [1, 2, 3]
print y # [1, 2, 3]
print x is y # True, x and y are the same object, which was modified in place
x = [1, 2]
y = x
y = y + [3]
print x # [1, 2]
print y # [1, 2, 3]
print x is y # False, y is a new object equal to x + [3]
x = 1
y = x
y += 2
print x # 1
print y # 3
print x is y # False, y is a new object equal to x + 2
如果這是家庭作業,請將其標記爲此類。謝謝! – senderle 2012-04-21 00:37:25
這是功課嗎? – dckrooney 2012-04-21 00:37:32
不!改版! – isal 2012-04-21 00:39:16