數據結構與算法筆記 lesson 15 遞歸

 遞歸

效率比較低,萬不得已不用遞歸,用迭代(循環)

文件夾索引操作


迭代使用的是循環結構, 遞歸使用的選擇結構

使用遞歸能使程序的結構更清晰,更簡潔,更容易讓人理解。

大量的遞歸調用會建立函數的副本,會消耗大量的時間和內存

例:

編寫一個遞歸函數,實現將輸入的任意長度的字符串反向輸出(‘#作爲輸入結束條件’)

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;
}


發佈了103 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章