教材:《数据结构与算法分析 java语言描述》 《数据结构 殷人昆》
java语言版https://github.com/AlexHSL/DS_JAVA.git
Hanoi塔c++实现:
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
void Hanoi( int n, string fromTower, string toTower, string auxTower )
{
if( n == 1 )
{
cout << "from " << fromTower << " to " << toTower << endl;
}
else
{
Hanoi( n - 1, fromTower, auxTower, toTower );
cout << "from " << fromTower << " to " << toTower << endl;
Hanoi( n - 1, auxTower, toTower, fromTower );
}
}
int main()
{
Hanoi( 5, "A", "B", "C" );
}
输入数字,查找该数字二进制表示后1的个数:
#include "pch.h"
#include <iostream>
using namespace std;
int count_num_1( int number )
{
if( number == 1 )
{
return 1;
}
else if( number == 0 )
{
return 0;
}
else
{
return count_num_1( number / 2 ) + number % 2;
}
}
int main()
{
int num;
cout << "输入数字,输出该数字二进制表示中1的个数:";
cin >> num;
cout << "结果是:" << count_num_1( num );
}
排列组合,输入n个数字,输出n个数字的全排列和n中选取r个数字的全组合
#include "pch.h"
#include <iostream>
using namespace std;
void Perm( int* n, int low, int high )
{
if( low == high )
{
for( int i = 0; i <= high; i++ )
cout << n[i] << " ";
cout << endl;
}
else
{
for( int i = low; i <= high; i++ )
{
swap( n[low], n[i] );
Perm( n, low + 1, high );
swap( n[low], n[i] );
}
}
}
int* res;
void C( int* n, int low, int high, int r, int x )
{
if( r == 0 )
{
for( int i = 0; i < x; i++ )
{
cout << res[i] << " ";
}
cout << endl;
}
else if( high - low == r - 1 )
{
res[x] = n[low];
C( n, low + 1, high, r - 1, x + 1 );
}
else
{
C( n, low + 1, high, r, x );
res[x] = n[low];
C( n, low + 1, high, r - 1, x + 1 );
}
}
int main()
{
int n, r;//输入n个数字,取r个
cout << "先输出n个数字的全排列,再输出从n个数字中取r个数字的所有组合,输入数字个数n和取数个数r:" << endl;
cin >> n >> r;
int* numbers = new int[n];
res = new int[r];
cout << "输入n个数字" << endl;
for( int i = 0; i < n; i++ )
{
cin >> numbers[i];
}
cout << "全排列结果:" << endl;
Perm( numbers, 0, n - 1 );
cout << "全组合结果:" << endl;
C( numbers, 0, n - 1, r, 0 );
}