Josephus问题解决方法五(递归)

该问题的解决方法有很多种,关于Josephus问题,前面已经给出了4种解法(http://blog.itpub.net/29876893/viewspace-1853008/),是笔者对该问题产生浓厚的兴趣下而写出的,这些算法(可以说是很简单的吧,嘿嘿)是笔者走路或者吃饭的时候想出的(原创哦~_~), 也许其中功能不是太完善或不当之处,请大家谅解。今天突然想起解决该问题是不是可以用递归呢?立马打开VS,简单的 修改了之前的解决方法四,通过画图分析这种方法是可行的。下面给出代码:

点击(此处)折叠或打开

  1. #include<iostream> //递归解决该问题
  2. #define MAX_SIZE 10
  3. using namespace std;
  4. int j, flag, q, sizeA;
  5. int i;
  6. char lastone;
  7. void searchnote(char *, int);
  8. void searchnote(char *A, int n) {

  9.  
  10.         if (== sizeA) {
  11.             i%=sizeA;
  12.         }
  13.         if(A[i] == NULL){
  14.             i++;                //跳过数据域为NULL的元素,i需要自增1
  15.             searchnote(A, n);  //该步中,本想用“臭名昭著"的goto语句,直接跳过下面的语句,但是笔者弃用了。
  16.             }
  17.          q++;
  18.             if (== n) {
  19.                 cout << A[i]<< " ";
  20.                 flag++;
  21.                 if (flag == sizeA) {
  22.                     lastone = A[i];
  23.                 }
  24.                 A[i] = NULL;
  25.                 q = 0;
  26.                 
  27.             }
  28.             if (flag == sizeA) {    //递归退出的条件
  29.                 cout << endl;
  30.                 cout << "获胜的同学是:" << endl;
  31.                 cout << lastone;
  32.                 cout << endl;
  33.                 exit(-1);
  34.             }
  35.             i++;    //i需要自增1
  36.             searchnote(A, n);
  37.         

  38. }

  39. int main() {

  40.     cout << "请输入同学的编号:" << endl;
  41.     char note[MAX_SIZE];
  42.     for (char ch; cin >>ch, j++) {
  43.         note[j] = ch;
  44.         cout << note[j] << " ";
  45.         sizeA++;
  46.     }
  47.     cout << endl;
  48.     cout << "出列同学的顺序依次是:" << endl;
  49.     searchnote(note, 4);
  50.     cout << endl;
  51. }
运行结果:

上面的代码,读者仔细对比解决方法四会发现,只是把方法四中的for语句去了,然后再简单的修改,这种递归看起来比较的臃肿,这是笔者最先想到的解决方法,弃用for语句。希望读者有更好的递归算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值