本刊第7~8期《雞兔同籠算法源流》一文對我國歷史上《孫子算經》《算法統宗》以及《鏡花緣》中出現的雞兔同籠問題的各種算法進行了梳理。在此基礎上,本文嘗試進一步探討產生這些算法的思想基礎。
一、算法與想法
解決數學問題通常需要兩種不同層次的方法,一種叫做算法,相當于《孫子算經》中所說的“術”或《算法統宗》中的“法”。以雞兔同籠問題為例,《孫子算經》中的半足術為:“上置頭,下置足,半其足,以頭除足,以足除頭即得。”《算法統宗》中給出的倍頭法為:“倍頭,減足,折半是兔。”《算法統宗》中對雞兔同籠問題的另外一種可以叫做四頭法的算法為:“四頭,減足,折半是雞。”[1]按照這樣的算法依次計算,可以順利得到問題的正確答案。
以上算法的一個顯著特征就是程序化,這種程序化實質上就是一種按部就班的操作模式,主要表現為兩個方面:第一是可操作性,第二是操作要有順序,這種順序通常不能打亂。也就是要明確怎么做,以及先做什么后做什么。比如《算法統宗》中的四頭法,第一步要計算的是“四頭”,即用4去乘總頭數35,得到140;第二步要計算的是“減足”,就是從第一步得到的結果140中減去總足數94得到46,這一步是以前面“四頭”的結果作為基礎的。鑒于算法程序化的特征,所以對算法的學習通常需要依賴模仿和練習。通過模仿可以記憶操作步驟和順序,通過練習逐步熟練這樣的操作。
解決數學問題需要的另外一種方法是想出算法的方法,是一種思考方法,可以叫做解決問題的“想法”。這里指的是思考內容的多元化,包含了問題的理解、算法的設計、算法的實施以及算法的比較與完善等諸多環節;發散性的一個含義是思考過程不具有前面所說的程序化特征,另一個含義是思考的結果可能是多樣的。正是這種多樣性使得思考結果具有可誤性,也就是思考的結果可能是錯誤的或不可行的。
數學教學僅停留在程序化的算法方面顯然是不夠的,還應當讓學習者經歷算法產生與完善的思考過程,這樣的過程無疑對學習者積累基本活動經驗、感悟基本思想會有所裨益。因此解決問題的教學研究需要探討如何想出算法,算法與想法是什么樣的關系。
二、什么是問題
為了研究產生算法的想法,首先要搞清楚什么是問題。按照通常的理解,一個問題指的是“一個情境(Situation),其中存在著阻礙達到目標(Goal)的障礙(Barrier),而且問題解決者并不能確定這樣的障礙是否能夠被克服。”[2]由這個定義可以看出,構成一個問題有三個關鍵因素,分別為情境、目標和障礙。
其中問題的情境是由與問題相關的所有信息及其關系構成的,問題的表達其實就是對問題情境的描述。其中的所有信息包括已知信息和未知信息,已知信息又可以區分為問題表達中直接給出的信息和沒有直接給出的信息,可以把直接給出的信息叫做直接信息,沒有直接給出的信息叫做暗含信息。雞兔同籠問題在《算法統宗》中用語言表達為:“今有雞兔同籠,上有三十五頭,下有九十四足。問雞兔各若干。”從中可以提取到的已知信息為:
一只雞有2個足(暗含信息);
一只兔有4個足(暗含信息);
一只雞和一只兔都是一個頭(暗含信息);
雞、兔共有35只(直接信息);
雞、兔總足數為94(直接信息)。
未知信息主要有雞總頭數(雞只數)、兔總頭數(兔只數)、雞總足數和兔總足數。各類信息之間的主要關系為:
雞總頭數的2倍是雞總足數;
兔總頭數的4倍是兔總足數;
雞總頭數與兔總頭數的和是雞兔總頭數35;
雞總足數與兔總足數的和是雞兔總足數94。
一個問題的目標指的是問題情境中某個或某些未知信息,而且問題提出者或問題解決者有獲得這樣信息的愿望。雞兔同籠問題的目標自然就是雞只數和兔只數。
問題的障礙是阻礙問題解決者從已知信息達到問題目標的因素,這樣的因素一方面與問題情境的難易有關,另一方面與問題解決者的經驗、知識、能力等主觀因素有關。對于雞兔同籠問題,如果問題解決者具有利用方程解決問題的知識和經驗,就會很容易地通過列方程建立已知信息和問題目標之間的聯系。無論是《孫子算經》中的半足術,還是《算法統宗》中的倍頭法和四頭法,都是在沒有利用方程作為工具的基礎上想出來的算法,那么古人想出這些算法的想法究竟是什么呢?
三、“半足術”背后的想法
問題的障礙往往表現為問題情境中的信息及其關系與問題解決者主觀意愿的某種對立。比如雞兔同籠問題中雞的特點是“一頭二足”,兔的特點是“一頭四足”,共同的特點是每只動物(雞或兔)的頭數與足數都是不同的,而且每只雞和每只兔的足數也不相同。[3](見圖1)
問題解決者的潛意識中往往認為,如果二者是相同的,問題就可以解決了。這種客觀的“不同”與主觀意愿中的“相同”,就形成了一種對立關系或矛盾關系,這種對立關系如果不能實現統一,也就是不能在某種條件下互相轉化,這樣的矛盾關系就構成了問題的障礙。解決問題的算法通常來源于對這種對立關系實現統一的思考。雞兔同籠問題諸多算法背后的想法或許就是對如何能夠創造條件,使得不同變為相同的思考。《孫子算經》中解決雞兔同籠問題所使用的半足術(94÷2=47),其實就是將每只雞的足數變成了1,與頭數相同了。(見圖2)
此時的每只雞都變成了“一頭一足”,每只兔都成為了“一頭二足”。因此取半后的47足就可以分為兩部分,一是與總頭數相同的部分(35),另一部分是與兔頭數相同的部分(47-35=12)。(見圖這樣就得到兔的只數是12了,當然也就不難求出雞的只數。因此可以說,每只動物(雞或兔)的頭數與足數不同,構成了解決雞兔同籠問題的一個障礙。《孫子算經》中的半足術來源于不同與相同這一對矛盾的統一,也就是通過“半足”創造出了變不同為相同的條件。
四、算法雖異想法尤同
《算法統宗》中的倍頭法和四頭法,從思想淵源上看,與《孫子算經》中的半足術是一脈相承的。半足術是通過“半足”使得每只雞的頭數和足數都成為1,而倍頭法是通過“倍頭(35x2=70)”讓每只雞的頭數和足數都成為2。(見圖4)
這樣總足數94就可以分為與總頭數相同的一部分(70),以及與兔頭數的2倍相同的另一部分(94-70=24)。所以24的一半就是兔的只數。《算法統宗》中的“四頭法”也來源于類似的想法,通過“四頭(35x4=140)”把每只兔的頭數變為4,與每只兔的足數相同了。(見圖5)
這時總頭數140就可以分為與總足數94相同的一部分,以及與雞頭數的2倍相同的一部分(圖5中的陰影部分,140-94=46),因此,46的一半就是雞的只數了。另外一個思路是將每只雞補上2個足(圖6中的陰影部分),這時總足數也變成了140。
補上的足數,也就是比94多出來的部分(140-94=46),恰好是雞頭數的2倍,所以46的一半就是雞的只數了。
綜上可以看出,《算法統宗》中倍頭法和四頭法這兩種算法背后的想法與《孫子算經》中的半足術是一樣的,都是為了將頭數與足數變成相同而產生的。由此可以總結出算法與相應的想法之間的一種關系,就是同一個想法可以產生諸多不同的算法,也就是算法雖然不同,但是想法可以相同。這也驗證了前面所論及的想法的發散性特征。
五、算法雖同想法各異
如前所說,《算法統宗》中的倍頭法和四頭法的想法是將雞或兔的頭數與足數變為相同,由此產生的算法用綜合算式可以表示為如下形式:
倍頭法:(94-35x2)÷(4-2)=12(兔)
四頭法:(35x4-94)÷(4-2)=23(雞)
還可以換一種方式分析雞兔同籠問題的障礙,如果問題情境中不是兩種動物,而只有一種動物,自然問題的解決就會變得容易,因此雞兔同籠問題的障礙還可以看做是雞足數(2)和兔足數(4)的不同造成的。由此產生的想法就是創造條件使得二者變為相同,按照這樣的想法,就可以假設35只都是雞,總足數就變成了35x2=70,比實際總足數94少了94-70=24,少的原因是每只兔少算了4-2=2個足,因此兔的只數就是24÷2=12。這一算法從程序上看與前面的倍頭法是一樣的。當然也可以先假設35只都是兔,可以得到與四頭法一樣的算法。雖然算法是相同的,但與前面半足術的想法是有差異的。如果把雞兔同籠問題轉化為幾何問題,那么對同樣的算法,還可以有新的想法。
用一個長方形的橫向邊長表示每只動物(雞或兔)的足數,縱向邊長表示動物的頭數,那么這個長方形的面積就可以表示這種動物的總足數。(見圖7)
圖7由上、下兩個長方形構成,下面長方形橫向邊長代表每只兔的足數4,縱向邊長代表兔頭數,因此下面長方形的面積就代表兔的總足數。同樣上面長方形的面積代表雞的總足數。根據雞兔同籠問題的已知信息可以知道,兩個長方形的縱向邊長之和代表的是總頭數35,面積之和代表的是總足數94。這樣雞兔同籠問題就變為了一個幾何問題:
如圖7的兩個長方形,已知橫向邊長分別為4和2,縱向邊長之和為35,兩個長方形的面積之和為94。求兩個長方形的縱向邊長分別是多少?
解決這一問題的障礙在于一個“亂”字,這種“亂”表現為兩個長方形的橫向邊長和縱向邊長均不相等。因此自然的想法就是實現“亂”與“齊”這一對矛盾的轉化,也就是創造條件設法變“亂”為“齊”。
一種變“亂”為“齊”的方式是“補”。如圖8添加輔助線,使得兩個不同的長方形拼接成了一個大長方形,由于這個大長方形的橫向邊長是4,縱向邊長是35,因此大長方形的面積就是35x4=140。
又由于原來兩個長方形面積之和是94,所以補上的長方形的面積就是140-94=46。
補上長方形的橫向邊長是4-2=2,所以縱向邊長就是:46÷2=23 ,也就是原題中的雞頭數。
另外一種變“亂”為“齊”的方法是“分”。如圖9添加輔助線,將下面長方形分為左右兩個部分。其中左面的部分與上面的長方形拼接成了一個面積為35x2=70的長方形,右面長方形的面積就是94-70=24。因此不難求出這個長方形縱向線段為:24÷2=12,也就是原題中兔只數是12。以上兩種算法列成綜合算式分別與《算法統宗》中的四頭法和倍頭法是完全一樣的。因此同樣的算法是可以在不同想法的指引下產生的,也就是算法雖然相同,但想法可以各異。這也是想法發散性的一種具體體現。
綜上可以看出,任何程序化的算法都是人創造出來的,任何創造算法的人都會有創造算法的想法,這樣的想法是具有育人功能的。數學教學及其質量的評價僅局限于“會算”與“算對”是不夠的,還應當讓學習者經歷算法背后想法的思考過程,這或許也是《義務教育數學課程標準(2011年版)》總目標中所倡導的“四基”[4]的一種體現。為此,就需要對數學課程內容中各種算法背后的想法進行歷史與文化方面的挖掘。
注釋與參考文獻:
[1]參見:郜舒竹. 雞兔同籠解法源流. 教學月刊. 2012.7~8.
[2]引自:Irving Tallman, Robert K. Leik, Louis N. Gray and Mark C. Stafford. A Theory of Problem-Solving Behavior. Social Psychology Quarterly, Vol. 56, No. 3 (Sep.1993), pp. 157-177.
[3]注釋:圖中符號“ ”表示雞或兔的1個頭,
“”表示雞或兔的1個足,下同。
[4]注釋:“四基”指的是基本知識、基本技能、基本活動經驗和基本思想。
(首都師范大學初等教育學院 100048)