使用遞歸函數求解字符串的逆置問題

一、遞歸函數概述

        在使用面向過程的編程語言進行程序編寫的過程中,一般是按照結構化的編程思想、模塊化的程序設計方法來進行程序的編寫和代碼的組織的。我們熟悉的C語言就是這樣一類程序設計語言,它通常以函數爲單位進行程序的模塊化組織,C源程序就是由一個主函數和若干非主函數構成的。計算機在執行C程序時,是按照順序從主函數main()開始執行,如果遇到調用其他函數的情況,則主函數暫停執行,轉而執行相應的函數,該函數執行完畢之後,返回主函數,主函數繼續執行,這稱爲函數的調用。不僅主函數可以調用其他函數,各個函數之間也是可以相互調用的,如果一個函數自己調用自己,我們稱之爲函數的遞歸調用。在某些特殊問題的求解中,使用遞歸函數有時候會有非常高的效率。(更好的閱讀體驗,請訪問程序員在旅途)
        遞歸(Recursion)在計算機科學中是指一種通過重複將問題分解爲同類的子問題而解決問題的方法,其核心思想是分治策略。 遞歸算法適合解決以下三類問題:

  1. 數據的定義是按遞歸定義的。如Fibonacci函數。
  2. 問題解法按遞歸算法實現。如Hanoi問題。
  3. 數據的結構形式是按遞歸定義的。如二叉樹、廣義表等。

二、字符串逆置例題求解

2.1 題目描述

        編寫一個函數把字符串逆置(如字符串"abcde"變成"edcba")。

2.2 分析求解

        將字符串逆置,可以將第一個字符串和最後一個字符串交換,再將剩下的字符串逆置,剩下的字符串長度就在原來的長度上減2,規模以此縮小,剩下的字符串逆置方法和第一次一樣,如果字符串長度≤1,則遞歸條件結束。程序如下:

#include<stdio.h>
//start,end爲字符串開始和結束的下標
void convert_str(char *str, int start, int end){
	char ch;
	if((end - start) < 1){  // <1說明字符串 只有一個字符,無無需交換,遞歸結束條件
		return ;  
	}else{
	
		ch = str[start];
		str[start] = str[end];
		str[end] = ch;
        convert_str(str,start+1,end-1); //遞歸調用該函數,將剩下的字符串進行交換
	}
}
int main(){

		char x[] = "abcdefgh";
		convert_str(x,0,7);

		printf("字符串逆置後爲: %s \n", x);

		return 0;
}

三、總結

        1)遞歸的精髓在於如何把規模大的、較難解決的問題變成規模較小的、易解決的同一問題,規模較小的問題又變成規模更小的問題,並且小到一定程度可以直接得出它的解,從而得到原來問題的解。此外,還得要注意遞歸的終止條件,也就是遞歸的出口,出口條件設置錯誤的話,程序會無法終止,從而導致程序的崩潰。
        2)遞歸的實現得益於棧這種數據結構,函數的每一次調用,都會使用棧來保存函數的參數、局部變量、返回地址等數據,因此,在使用遞歸的時候,一定要考慮遞歸的深度問題,如果過深,會容易造成棧溢出,導致問題求解失敗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章