『壹』 圖形化編程如何將大問題分解為小問題
分治法、動態規劃等方法。
如果我們遇到的問題很大,可以嘗試先把大問題分解成小問題,然後再遞歸地解決這些小問題。
把復雜問題分解成若干個小問題,是解決很多復雜問題的有效方法,從整體上來說,面向過程和面向對象的設計哲學都有這種分解思維的體現。
『貳』 兒童編程邏輯思維:如何將問題分解,然後逐一突破,重點培養
在生活中,我們肯定會遇到比較困難或復雜的問題。在兒童編程世界中,如何解決復雜的問題,這次我們來一起聊下。
什麼是問題分解?
問題分解 ,就是將一個復雜的大問題,拆分成多個簡單的小問題,然後,再逐個解決。例如,在課堂上,老師要求大家畫出和自己身體一樣大的人體圖,這時怎麼做呢?想要整個畫出和我們身體大小相仿的圖,當然不是一件容易的事情。不過,如果將人的身體拆分成頭,手臂,身體,大腿,小腳,腳等部件,分別畫好後再拼合到一起,是不是容易很多呢?問題是不是容易解決了呢?
學會分解問題,我們就可以更輕松地解決生活中遇到的很多難題,因此,如果再遇到復雜問題,可以先試著將其拆解一個個簡單的小問題,然後在逐個解決,這樣肯定會簡單很多。
給大家准備了一個小 游戲 ,和孩子一起親子互動吧。
游戲 說明:
將大問題拆分成小問題,然後,逐一解決。
游戲 約定:
仔細思考製作食物的過程並拍照。
游戲 准備:
一次性紙盤,食物圖片。
游戲 重點:
幫媽媽准備早餐,做早餐是一個既簡單又貼近生活的 游戲 。一頓早餐看似簡單,卻包括做主食,燉湯,炒菜等小問題,然後,再逐個解決。小朋友可以通過這樣的 游戲 學習如何拆解問題。
第一步,准備好幾個一個性紙盤和早餐步驟圖。
第二步,剪下早餐步驟圖下的圖片。
第三步,先將早餐拆分為主食,燉湯,炒菜三大項,並分別將與之相關的圖片收集起來,放在不同的盤中。
第四步,為了順利完成這三項早餐工作,必須在分別將其拆分成更小的執行細項,並將相關的圖片放在不同的盤中。例如,可以將做主食拆分為蒸米飯和烙雞蛋餅,將炒菜拆分為炒肉和炒西葫蘆。
第五步,仔細觀察盤中的圖片,然後,試著按照先後順序進行排列整理。
第六步,將圖片排列整理好後,我們就完成了一頓美味的早餐。這時就可以請大家一起來「享用」啦。
游戲 小提醒:
在父母的幫助下,孩子也可以不用圖片模擬,而是直接動手用食材准備一桌豐盛的佳餚。父母可以將該做的事情告訴孩子,讓他試著自己安排順序,或者和他一起將問題拆分成小項,然後逐個解決。這樣不僅能讓孩子學習拆解問題的方法,而且還能留下家人共同美好的回憶呢。
『叄』 有一個整數N,N可以分解成若干個整數之和,問如何分解能使這些數的乘積最大。(c語言)
我不寫完整程序,提一下思路:
我們要編寫一個函數,這個函數把一個數分為兩個數之和,並且這兩個數的乘積最大,這樣的函數是不是很好編寫,代碼如下:
void f1(int a, int *x,int *y){
*x=a/2;
*y=a-*x;
}
知道為什麼這樣分嗎,原理很簡單:兩個數都最大的時候,乘積才最大。也就是各取一半,如果a是奇數就讓y多1。
要完成把N分為多個數,使其乘積最大,我們就先分為兩個數,然後分別對這兩個數進行各自進行拆分(遞歸調用),直到分開的兩個數乘積比分前小,那就取消這次拆分。
基於以上說明,我們對f1函數進行修改,增加遞歸調用部分:
void f1(int n){
int x,y;
x=n/2;
y=n-x;
if (n>=x*y) printf("%d ",n);
else {f1(x);f1(y);}
}
添加計算乘積m的代碼,以及主程序,完成的如下:
-----------------
int m;
void f1(int n){
int x,y;
x=n/2;
y=n-x;
if (n>=x*y) {printf("%d ",n);m*=n;}
else {f1(x);f1(y);}
}
main(){
int n;
m=1;
scanf("%d",&n);
f1(n);
printf("\n%d",m);
}
-----------------
程序在SCO UNIX上運行通過,結果如下:
-----------------
$ cc a.c
$ a.out
9
4 2 3
24
$ a.out
10
2 3 2 3
36
$ a.out
12
3 3 3 3
81
$
-----------------