天天看点

递归解决约瑟夫环问题

#include<iostream>
using namespace std;
struct Node
{
	int val;//存放数值
	int tag;//0表示元素删除,1表示元素存在
};
int num;//记录要出列的序号

int fun(int m, int num)
{
	if (m == 1)//递归出口,若仅剩一人,则输出其编号
		return m;
	return (fun(m - 1, num) + num - 1) % m + 1;
	
}
int main()
{
	cout << "请输入队列中的人数:" << endl;
	int m, seq = 1;//m表示当前队列总人数,seq表示当前队列成员的报数
	cin >> m;
	Node *a = (Node *)malloc((m + 1) * sizeof(Node));//下标从1开始,第一个单元空出
	cout << "队列中的人员编号为:" << endl;
	for (int i = 1; i <= m; i++)
	{
		a[i].val = i;
		a[i].tag = 1;//初始化队列
		cout << a[i].val << " ";
	}
	cout << endl;
	cout << "请输入每次报数要求出列的序号:" << endl;
	cin >> num;
	cout << "最后人员编号为:" << endl;
	cout << fun(m, num) << endl;;
	system("pause");
	return 0;
}