遞迴 運用遞迴思想解題

2021-07-08 16:16:17 字數 1717 閱讀 2266

標籤: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 ...