資料結構與演算法讀書筆記 - 004 -C++遞迴

Bert Jiachen Wang發表於2020-12-26

————————————————————
遞迴的例子
————————————————————
————————————————————
排序的原理:
1)所以把每個元素都放在開頭一次,所以把每個元素都提出來一次
2)剩下的元素按所有可能排序
{
剩下的元素,1)所以把每個元素都提出來一次
2)剩下的元素按所有可能排序
{…}
3)然後把剛才提出來的那個元素放在每一種可能的開頭
}
3)然後把剛才提出來的那個元素放在每一種可能的開頭
這就是像模像樣的遞迴了,不過因為要實現“每一個元素一次”,所以要有for迴圈的過程
————————————————————
硬編碼

	vector<int> vec = { 1,2,3 };
	for (int i = 0; i < 3; ++i)
	{
		std::swap(vec[0], vec[i]);
		for (int i = 0; i < 2; ++i)
		{
			std::swap(vec[1], vec[i + 1]);
			for (auto i : vec)
				cout << i;
			cout << endl;
			std::swap(vec[i + 1], vec[1]);
		}
		std::swap(vec[i], vec[0]);
	}

結果

123
132
213
231
321
312

————————————————————
函式版本

void permutation(vector<int> vec, int k, int m)
{
	if (k == m)
	{
		for (auto i : vec)
			cout << i << "  ";
		cout << endl;
	}
	else
	{
		for (int i = 0; i < (m - k); ++i)
		{
			std::swap(vec[k], vec[i+k]);
			permutation(vec, k + 1, m);
			std::swap(vec[i+k], vec[k]);
		}
	}
}

使用

	vector<int> vec = { 1,2,3,4 };
	
	permutation(vec, 0, vec.size());

輸出

1  2  3  4
1  2  4  3
1  3  2  4
1  3  4  2
1  4  3  2
1  4  2  3
2  1  3  4
2  1  4  3
2  3  1  4
2  3  4  1
2  4  3  1
2  4  1  3
3  2  1  4
3  2  4  1
3  1  2  4
3  1  4  2
3  4  1  2
3  4  2  1
4  2  3  1
4  2  1  3
4  3  2  1
4  3  1  2
4  1  3  2
4  1  2  3

————————————————————
參考 / 讀書筆記讀的書:
————————————————————

C++ Primer(第五版)ISBN 978-7-121-15535-2
資料結構,演算法與應用:C++語言描述(第二版)ISBN 978-7-111-49600-7

2020.12.26更新

相關文章