標籤:c語言 遞迴
by 小威威
遞迴思想,就是通過不斷呼叫自己直到滿足某一條件為止。對於遞迴的定義,我在這裡就不在闡述了,書上都寫的很明白,最典型的例子就是「從前山上有乙個老和尚和乙個小和尚…」。下面我就直接上題目,通過題目來進一步了解遞迴,學習遞迴。
典例1:
給出乙個陣列,長度為n,編號為0~(n-1),接下來n行,第i行描述關於第i個位置的資訊。每行先是乙個數k表示從位置i-1可以跳到其他的k個位置去,之後是k個數,表示i-1號點可以跳到的位置,這些位置一定在i-1號位置之後,且從小到大排列。
現在有乙個小朋友,從0號位置出發,每次往他可以跳的位置跳過去,且從編號小的開始跳。如果遇到乙個位置不能繼續跳下去則返回之前的位置。
輸出一路上途徑的所有點。
例如,n= 5 n行資料如下
1 12 2 3
1 4小朋友從0出發,可以跳到1去,然後從1可以跳到2和3,選擇小的所以跳到了2,從2沒有位置可以跳,所以返回1,再從1跳往3, 3可以繼續跳到4,到4後不能繼續跳所以返回3,這時3也沒有位置可以跳,繼續返回1, 再返回0
所以要輸出的就是0 1 2 1 3 4 3 1 0
為方便輸出,每個數字,包括這一行最後乙個數字,後面都跟乙個空格。輸出結尾要有換行
n不超過100,每個k都不超過5
這道題有幾個難點:
1.如何儲存資料?
2.如何實現位置的跳躍?
3.如何實現位置的返回?
4.如何實現同層位置的移動?
第四點,是卡了我很久的一大難點,雖然很簡單,但是當時沒想到這種思路。
下面我們乙個乙個點解決。
第乙個,如何儲存資料?
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
}
此處我用二維陣列儲存資料,因為如果用一維陣列,層與層之間的關係就體現不出來了。先輸入n,決定二維陣列的行數,也就是確定樓層數。這個二維陣列不是我們平常建立的矩形陣列,因為它每行的元素個素不相等,取決於我們輸入的資料。所以在兩個for迴圈之間再插入乙個scanf來確定每行元素的個數。至於為什麼用乙個一維陣列儲存每行元素長度,講到後面我們自然就明白了。因為這些資料在後面還有用。
第二個,如何實現位置的跳躍?與第三個,如何實現位置的返回。
這裡就需要用到遞迴的思想。
我們將位置傳入函式,在函式中再次呼叫該函式,把陣列裡的內容作為位置傳入函式,這樣就實現了位置的跳躍。當函式中的內容執行完畢後,就會返回上一層函式,這樣就實現了位置的返回。
第四個,如何實現同一行位置的移動?
這裡用到了乙個for迴圈加遞迴的方法。就是在函式體中的for迴圈中再次呼叫函式。隨著迴圈變數的更新,同一行上的位置就能向右平移。
函式實現如下:
void jump(int location)
遞迴不好理解,要自己用筆在紙上畫出每一層函式,然後模擬遞迴一層一層返回。
完整**如下:
# include
void jump(int location);
int a[100][5], b[100];
int main(void)
}jump(0);
printf("\n");
return0;}
void jump(int location)
}
漫談遞迴 遞迴的思想
為什麼要用遞迴 程式設計裡面估計最讓人摸不著頭腦的基本演算法就是遞迴了。很多時候我們看明白乙個複雜的遞迴都有點費時間,尤其對模型所描述的問題概念不清的時候,想要自己設計乙個遞迴那麼就更是有難度了。用歸納法來理解遞迴 數學都不差的我們,第一反應就是遞迴在數學上的模型是什麼。畢竟我們對於問題進行數學建模...
遞迴思想與遞迴程式設計
今天來談談遞迴程式設計,我想參與過程式設計經歷的,或者學過程式設計的都應該了解遞迴,遞迴思想在解決一些問題上顯得尤為方便,能發出意想不到的效果,但是遞迴程式設計顯然難度比較大,沒有非常豐富的程式設計經驗或者對遞迴有過很深的理解,不能隨手就寫出遞迴的 所以今天就來談談遞迴怎麼用?遞迴的程式設計模式就是...
遞迴演算法運用
public static void main string args 一 遞迴方法列出指定目錄下所有的檔名 public static boolean listfile file file file str file.listfiles listfiles 返回指定路徑下所有的目錄和檔案 for ...