讓我們暫時不要考慮編程語言,想想這個方法是抽象的。
試想一下,如果你是在具有二十疊紙,每個與他們單號的房間。你願意將所有數字的總和彙總在一起,但你意識到逐一進行是永恆的。所以,你打電話給一個朋友,你們每個人都會拿到十個籌碼。你必須做的工作量致電你的朋友下降了一半。
你們都意識到你不會拿着十疊紙來到任何地方,所以你們每個人都會打電話給另一個朋友伸出一隻手,讓你們四個人一個一個地堆滿五堆。合理,但仍然壓倒一切。所以每個人都會再次打電話給另一位朋友,並與其他朋友一起將他們的籌碼減半 - 讓每個人都擁有2.5堆帶有數字的紙張。
大家都同意,這是一個人要完成的合理工作量,因此您可以將這些數字加在一起。從最後一組人員開始工作,每個人都會返回他們所有數字的總和,直到您擁有其他人的總和,並且您擁有自己的數額。你將這兩者相加並得出你的結果。
這是分而治之的原理:你的工作棧被分成了一小部分工作,然後你打電話給其他方法去做。
下面是Python中的一個僞示例。
def sum(*args):
if len(args) == 0: # Nothing in my list, so I'm done
return 0
elif len(args) == 1: # One thing in my list, return that
return args[0]
else: # Too much for me to handle; call in the Calvary!
return args[0] + sum(args[1:])
這就是我的想法,但我不知道如何跟蹤所有被拆分的數組。如果我遞歸地調用120個數字,我最終會得到30個基本大小的數組羣 – shinjuo 2013-02-18 04:34:19
這就是遞歸的要點:你不跟蹤。所有的方法都是傳遞它,然後等待返回值。例如,在'結束'時,當你有4個項目時,說他們的總和爲9,然後返回到調用方法。其他4個項目的方法將總和分爲13. OK,9 + 13 = 22。這是傳遞到早期的呼叫。好吧,現在我們沿着另一棵樹走下去。它有5個和8個,所以13.22 + 13 = 35。好的,這已經過去了。等等。 – Joe 2013-02-18 04:37:06
哦,我現在明白了。我覺得應該在學校早些時候教這種課。它 – shinjuo 2013-02-18 04:40:32