遞歸
效率比較低,萬不得已不用遞歸,用迭代(循環)
文件夾索引操作
迭代使用的是循環結構, 遞歸使用的選擇結構
使用遞歸能使程序的結構更清晰,更簡潔,更容易讓人理解。
大量的遞歸調用會建立函數的副本,會消耗大量的時間和內存
例:
編寫一個遞歸函數,實現將輸入的任意長度的字符串反向輸出(‘#作爲輸入結束條件’)
void print() { char a ; scanf("%c",&a); if(a!='#') printf(); if(a!='#') printf("%c",a); }
分治思想
一問題規模較大且不易求解的時候,就可以考慮將問題分成幾個小的模塊,逐一解決
採用分治思想處理問題,其各個小模塊通常具有與大問題相同的結構。
漢諾塔
思路
先將前63個盤子移動到Y上,確保大盤在小盤下。
再將最底下的第64個盤子移動到Z上
最後將Y上的63個盤子移動到Z上
第1步是將1~63個盤子藉助Z移動到Y上,
第3步將Y針上的63個盤子藉助X移動到Z針上。
解決第1步:
先將前62個盤子移動到Z上,確保大盤在小盤下。
再將最底下的第63個盤子移動到Y上
最後將Z上的62個盤子移動到Y上
解決第3步:
先將前62個盤子移動到X上,確保大盤在小盤下。
再將最底下的第63個盤子移動到Z上
最後將Z上的62個盤子移動到Y上
#include<stdio.h> //入參n, x,y,z 分別爲 把n個盤子從 x 藉助 y 移動到 z 上 void move(int n, char x, char y, char z) { if (1 == n) { printf("%c-->%c\n", x, z); //最後一步,把x上的最後一個盤子移動到z上 } else { move(n - 1, x, z, y); //將n-1個盤子從x藉助z移動到y上 printf("%c-->%c\n", x, z); //將第n個盤子從x移動到z上 move(n - 1, y, x, z); //將n-1個盤子從y藉助x移動到z上 } } int main() { int n; printf("請輸入漢諾塔的層數:"); scanf("%d", &n); printf("移動的步驟如下:\n"); move(n, 'X', 'Y', 'Z'); return 0; }