Josephus问题解决方法五(递归)
2015-12-09 13:48
281 查看
该问题的解决方法有很多种,关于Josephus问题,前面已经给出了4种解法(http://blog.itpub.net/29876893/viewspace-1853008/),是笔者对该问题产生浓厚的兴趣下而写出的,这些算法(可以说是很简单的吧,嘿嘿)是笔者走路或者吃饭的时候想出的(原创哦~_~),也许其中功能不是太完善或不当之处,请大家谅解。今天突然想起解决该问题是不是可以用递归呢?立马打开VS,简单的
修改了之前的解决方法四,通过画图分析这种方法是可行的。下面给出代码:
点击(此处)折叠或打开
#include<iostream> //递归解决该问题
#define MAX_SIZE 10
using namespace std;
int j, flag, q, sizeA;
int i;
char lastone;
void searchnote(char *, int);
void searchnote(char *A, int n) {
if (i == sizeA) {
i%=sizeA;
}
if(A[i] == NULL){
i++; //跳过数据域为NULL的元素,i需要自增1
searchnote(A, n);
//该步中,本想用“臭名昭著"的goto语句,直接跳过下面的语句,但是笔者弃用了。
}
q++;
if (q == n) {
cout << A[i]<< "
";
flag++;
if (flag == sizeA) {
lastone = A[i];
}
A[i] = NULL;
q = 0;
}
if (flag == sizeA) {
//递归退出的条件
cout << endl;
cout << "获胜的同学是:" << endl;
cout << lastone;
cout << endl;
exit(-1);
}
i++; //i需要自增1
searchnote(A, n);
}
int main() {
cout << "请输入同学的编号:" << endl;
char note[MAX_SIZE];
for (char ch; cin >>ch, j++) {
note[j] = ch;
cout << note[j] << "
";
sizeA++;
}
cout << endl;
cout << "出列同学的顺序依次是:" << endl;
searchnote(note, 4);
cout << endl;
}
运行结果:
上面的代码,读者仔细对比解决方法四会发现,只是把方法四中的for语句去了,然后再简单的修改,这种递归看起来比较的臃肿,这是笔者最先想到的解决方法,弃用for语句。希望读者有更好的递归算法。
修改了之前的解决方法四,通过画图分析这种方法是可行的。下面给出代码:
点击(此处)折叠或打开
#include<iostream> //递归解决该问题
#define MAX_SIZE 10
using namespace std;
int j, flag, q, sizeA;
int i;
char lastone;
void searchnote(char *, int);
void searchnote(char *A, int n) {
if (i == sizeA) {
i%=sizeA;
}
if(A[i] == NULL){
i++; //跳过数据域为NULL的元素,i需要自增1
searchnote(A, n);
//该步中,本想用“臭名昭著"的goto语句,直接跳过下面的语句,但是笔者弃用了。
}
q++;
if (q == n) {
cout << A[i]<< "
";
flag++;
if (flag == sizeA) {
lastone = A[i];
}
A[i] = NULL;
q = 0;
}
if (flag == sizeA) {
//递归退出的条件
cout << endl;
cout << "获胜的同学是:" << endl;
cout << lastone;
cout << endl;
exit(-1);
}
i++; //i需要自增1
searchnote(A, n);
}
int main() {
cout << "请输入同学的编号:" << endl;
char note[MAX_SIZE];
for (char ch; cin >>ch, j++) {
note[j] = ch;
cout << note[j] << "
";
sizeA++;
}
cout << endl;
cout << "出列同学的顺序依次是:" << endl;
searchnote(note, 4);
cout << endl;
}
运行结果:
上面的代码,读者仔细对比解决方法四会发现,只是把方法四中的for语句去了,然后再简单的修改,这种递归看起来比较的臃肿,这是笔者最先想到的解决方法,弃用for语句。希望读者有更好的递归算法。
相关文章推荐
- windows误删文件恢复
- Web安全:XSS的原理分析与解剖
- Mysql中普通的索引、主键、唯一、全文索引的区别
- HDU 4757 Tree 可持久化字典树
- 用基础动画实现iOS控件循环旋转
- request使用getReader()和getInputStream()获取请求参数报400错误
- 博客收集
- 【原创】Oracle实现PGSQL的generate_series
- Linux 下编译及调试 C 代码的简易指南
- Android-多线程
- 内容分发平台个性化推荐系统经验简单总结
- Linux Kernel(Android) 加密算法汇总(四)-应用程序调用OpenSSL加密演算法
- 基于cookie实现zTree树刷新后,展开状态不变
- 丢沙包游戏(或杀人游戏)的C语言实现
- ReactiveCocoa RACObserve subscribeNext 时,只有值不一样时才响应
- Spring4.2.3 +Struts2.3.24 +Hibernate4.3.11配置过程
- font-size --- inline-block
- 开始博客之旅,记录工作点滴!
- DMA Engine API Guide
- 脏读、不可重复读、幻读区别