C++物件導向程式設計——遞迴實現字串的反序

翡翠的風吟發表於2020-12-08

C++物件導向程式設計

題目:用遞迴演算法編寫一個程式,實現字串的反序。

#include<iostream>
#include<string.h>
using namespace std;
int opp_str(char *str, int n)
{
	static int m = 0;
	if (n <= m)
		return 1;
	char tmp = str[m];
	str[m++] = str[n];
	str[n] = tmp;
	return opp_str(str, n - 1);
}
int main()
{
	char str[100];
	gets_s(str);
	opp_str(str,strlen(str)-1);
	puts(str);
	return 0;
}

程式碼解釋如下:

定義了一個內部靜態變數m,並且初始化令m=0.

if函式體下面的三行程式碼和一般的交換函式概念相同,故不做解釋。

在編寫的遞迴函式中,實現了字串的反序。需要注意的是,遞迴和迴圈一樣其實都需要一個判別是否停止的條件。在這個遞迴函式中,假如字串中需要排序的字元有8個。那第一輪遞迴是1號和8號交換順序,然後2號(m)和7號(n)交換順序,直到n小於m,比如4號和5號交換後的順序是5(m)、4(n),此時遞迴已經結束了,你不能夠把5、4的順序再顛倒過來。

接下來是程式碼測試

測試一
輸入任意,注意大小要小於定義的陣列大小。可以看到,程式已經完美的達成了字串反序這一目的。

最後,拋給大家一個問題。感興趣的讀者可以考慮一下。

其實我的程式碼已經比較精簡了,但是在寫的過程中我覺得還是有內容可以簡化。這裡m的定義是否是必須的?能否在遞迴函式的每一輪遞迴中,通過一個較好的邏輯表達代替掉m,從而實現更高的效率?

轉載請宣告作者:

北京理工大學-宇航學院-探測制導與控制技術-劉鵬飛
ID:翡翠的風吟

這門課程讓我學到了很多細節,比直接看C++ primer plus的效率要高。並且老師也介紹了很多實用的方法,這讓我實現大規模工程軟體程式設計時,能夠節省空間和提升效率,總的來說這門課選的不虧,但是和小學期一樣依舊沒有題目能讓我花太多時間。所以,我還是比較期待課上能出一些比較有趣的演算法題目。(平時在ROS上碰壁慣了,在這門課上找回了自信。)

相關文章