C ++ Recursion:晚宴派对安排

时间:2018-04-01 21:02:04

标签: c++ recursion

dinner_shuffles方法应该将n晚餐客人的所有可能安排作为字符串向量返回。使用的名称应该是构造函数中指定的前n个名称。

字符串的末端代表圆桌的相邻端椅。

晚餐客人安排的顺序没有说明。

这是一个简单的例子。如果晚餐的客人是abcde,那么dinner_shuffles(3)的结果将是:

  

ABC

     

ACB

     

BAC

     

BCA

     

驾驶室

     

CBA

  • 晚餐客人姓名是一个字符串

  • 即使知道定义这种递归关系的等式也非常有用,谢谢

**更新:我已经发现Fibonacci序列的组合数如下:F(n)= F(n-1)+ F(n-2) - 2. I' m c ++的新手,我不确定如何用字母表示来形象化。

1 个答案:

答案 0 :(得分:0)

  

即使知道定义这种递归关系的等式也非常有用,谢谢

等式类似于this

  • 如果字符串的长度为1,则返回排列(基本情况)。
  • 否则,让每个角色在第一个位置转弯 并递归调用删除该字符的字符串的其余部分。

这个问题是一样的,通过检查是否有1个人站立,只剩下一个选择, 否则产生下一个座位可以坐的所有安排。

如果它仍然没有意义,请尝试单独执行this简化代码。

否则,请看一下这个解决方案:

#include <iostream>
#include <vector>
using namespace std;

vector<string> arrangements;

class Table
{
public:
    string seated = "";
    string notSeated = "";

    Table(string n);
    vector<string> dinner_shuffles(int n);
};

Table::Table(string n)
{
  seated = "";
  notSeated = n;
}

vector<string> Table::dinner_shuffles(int n)
{
    //The names used should be the first n names as designated in the constructor.
    notSeated = notSeated.substr(0, n);

  if (notSeated.length() == 1)
  {
    arrangements.push_back(seated+notSeated);
  }
  for (int i = 0; i < notSeated.length(); i++)
  {
    Table newArrangement(notSeated.substr(0,i) + notSeated.substr(i+1, notSeated.length()));
    newArrangement.seated = seated + notSeated[i];
    newArrangement.dinner_shuffles(n);
  }
   //return all possible arrangements of n dinner guests as a vector of strings.
  return arrangements;
}

int main()
{
    //dinner guest names are fed in as a string
    string notSeated = "abcde";
    Table table(notSeated);

    vector<string> vals = table.dinner_shuffles(3);

    //abc, acb, bac, bca, cab, cba
    for (int i = 0; i < vals.size(); i++){
        cout << vals[i] << endl;
    }
    return 1;
}