首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >伪编码辅助

伪编码辅助
EN

Stack Overflow用户
提问于 2015-04-14 17:59:21
回答 2查看 692关注 0票数 1

来自维京密码学校工程原理预科课程:

10个朋友围成一圈围坐在一张桌子上,决定玩一个新游戏。在它中,他们通过从1到100的数字来计数。第一个人说"1",第二个人说"2“等等。但有几个渔获量:

每当数字被7整除时,他们就会改变方向。所以人6会说"6",人7会说"7",然后6人又会说"8“。每当数字被11整除时,他们就跳过下一个人。

伪码是一个程序,它将决定哪个玩家是一个说"100“的人。一个人是如何开始弄明白这个逻辑的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-16 19:24:43

在编程中,选择合适的数据结构可以极大地简化求解特定问题的算法。使用循环双链表可以很好地解决您的问题。由于有十个朋友围成一圈,我们将把他们列入链接列表如下:

代码语言:javascript
复制
                   next   +-------+   next
               +--------->|       |----------+
               |          |   1   |          |
               |       +--|       |<--+      v
           +-------+   |  +-------+   |  +-------+
           |       |   |              |  |       |
       +-->|  10   |<--+ prev    prev +--|   2   |---+
       |   |       |                     |       |   |
  next |   +-------+                     +-------+   | next
       |       |                             ^       v
   +-------+   | prev                   prev |   +-------+
   |       |   |                             |   |       |
   |   9   |<--+                             +---|   3   |
   |       |                                     |       |
   +-------+                                     +-------+
     ^   |                                         ^   |
next |   | prev                               prev |   | next
     |   v                                         |   v
   +-------+                                     +-------+
   |       |                                     |       |
   |   8   |---+                             +-->|   4   |
   |       |   |                             |   |       |
   +-------+   | prev                   prev |   +-------+
       ^       v                             |       |
  next |   +-------+                     +-------+   | next
       |   |       |                     |       |   |
       +---|   7   |--+ prev    prev +-->|   5   |<--+
           |       |  |              |   |       |
           +-------+  |   +-------+  |   +-------+
               ^      +-->|       |--+       |
               |          |   6   |          |
               +----------|       |<---------+
                   next   +-------+   next

例如,在JavaScript中,您可以将其编写为:

代码语言:javascript
复制
var firstFriend = toList([1,2,3,4,5,6,7,8,9,10]);

function Node(prev, data, next) {
    this.prev = prev;
    this.data = data;
    this.next = next;
}

function toList(array) {
    var length = array.length;
    if (length === 0) throw new Error("empty array");
    var root = new Node(null, array[0], null), node = root, i = 1;
    while (i < length) node = node.next = new Node(node, array[i++], null);
    return (root.prev = node).next = root;
}

现在,我们可以使用两个相互递归的函数来解决这个问题:一个用于正向计数的朋友,另一个用于反向计数的朋友:

代码语言:javascript
复制
var answer = forward(1, firstFriend);

function forward(count, friend) {
    if (count      === 100) return friend.data;
    if (count % 7  === 0 &&
        count % 11 === 0)   return reverse(count + 1, friend.prev.prev);
    if (count % 7  === 0)   return reverse(count + 1, friend.prev);
    if (count % 11 === 0)   return forward(count + 1, friend.next.next);
                            return forward(count + 1, friend.next);
}

function reverse(count, friend) {
    if (count      === 100) return friend.data;
    if (count % 7  === 0 &&
        count % 11 === 0)   return forward(count + 1, friend.next.next);
    if (count % 7  === 0)   return forward(count + 1, friend.next);
    if (count % 11 === 0)   return reverse(count + 1, friend.prev.prev);
                            return reverse(count + 1, friend.prev);
}

把所有这些放在一起,答案是1

代码语言:javascript
复制
var firstFriend = toList([1,2,3,4,5,6,7,8,9,10]);

var answer = forward(1, firstFriend);

alert(answer);

function Node(prev, data, next) {
    this.prev = prev;
    this.data = data;
    this.next = next;
}

function toList(array) {
    var length = array.length;
    if (length === 0) throw new Error("empty array");
    var root = new Node(null, array[0], null), node = root, i = 1;
    while (i < length) node = node.next = new Node(node, array[i++], null);
    return (root.prev = node).next = root;
}

function forward(count, friend) {
    if (count      === 100) return friend.data;
    if (count % 7  === 0 &&
        count % 11 === 0)   return reverse(count + 1, friend.prev.prev);
    if (count % 7  === 0)   return reverse(count + 1, friend.prev);
    if (count % 11 === 0)   return forward(count + 1, friend.next.next);
                            return forward(count + 1, friend.next);
}

function reverse(count, friend) {
    if (count      === 100) return friend.data;
    if (count % 7  === 0 &&
        count % 11 === 0)   return forward(count + 1, friend.next.next);
    if (count % 7  === 0)   return forward(count + 1, friend.next);
    if (count % 11 === 0)   return reverse(count + 1, friend.prev.prev);
                            return reverse(count + 1, friend.prev);
}

手动解决它以检查正确性:

代码语言:javascript
复制
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  | 10  |
+=====+=====+=====+=====+=====+=====+=====+=====+=====+=====+
|  1  |  2  |  3  |  4  |  5  |  6  |  7  |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 12  |     | 11  | 10  |  9  |  8  |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     |     | 14  | 13  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     |     |     | 15  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 16  | 17  | 18  | 19  | 20  | 21  |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 25  | 24  | 23  |     | 22  |     |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     | 28  | 27  | 26  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     |     | 29  | 30  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 31  | 32  | 33  |     | 34  | 35  |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 40  | 39  | 38  | 37  | 36  |     |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     |     | 42  | 41  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     |     |     | 43  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 44  |     | 45  | 46  | 47  | 48  | 49  |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 55  | 54  | 53  | 52  | 51  | 50  |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     |     | 56  |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     |     |     | 57  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 58  | 59  | 60  | 61  | 62  | 63  |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 67  |     | 66  | 65  | 64  |     |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     | 70  | 69  | 68  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     |     | 71  | 72  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 73  | 74  | 75  | 76  | 77  |     |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 80  | 79  | 78  |     |     |     |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     | 84  | 83  | 82  | 81  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     | 85  | 86  | 87  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 88  |     | 89  | 90  | 91  |     |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 95  | 94  | 93  | 92  |     |     |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     | 98  | 97  | 96  |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|     |     |     |     |     |     |     |     | 99  |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 100 |     |     |     |     |     |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

尽管此解决方案是递归的,但每个递归程序都可以使用堆栈转换为非递归程序。这个程序的伪码非常简单。因此,我将把它作为一项练习留给你们去弄清楚。

票数 0
EN

Stack Overflow用户

发布于 2015-04-14 18:19:40

我所做的是创建一个for循环到100,并在里面有一个变量来跟踪方向,另一个保持当前播放器的跟踪。我在循环中使用if语句来决定方向是否应该切换,或者当前播放器是增加还是减少。

这是我最后得到的,它不漂亮,但它应该有效:

代码语言:javascript
复制
int curPlayer = 1;
int direction = 1;

for(int i = 1; i <= 100; i++)
{
    if(i % 7 == 0 && direction == 1)
    {
        direction = 0;
    }
    else if(i % 7 == 0)
    {
        direction = 1;
    }

    if(i % 11 == 0 && direction == 1)
    {
        curPlayer++;
    }
    else if(i % 11 == 0)
    {
        curPlayer--;
    }

    if(direction == 1)
    {
        curPlayer++;
    }
    else
    {
        curPlayer--;
    }

    if(curPlayer > 10)
    {
        curPlayer = curPlayer - 10;
    }
    else if(curPlayer < 1)
    {
        curPlayer = curPlayer + 10;
    }
}

return curPlayer;

伪码:

代码语言:javascript
复制
set curPlayer to 1
set direction to 1

for(i is 1 to 100)
{
    if i is divisible by 7 and direction is 1
    {
        set direction to 0
    }
    else if i is divisible by 7
    {
        set direction to 1
    }

    if i is divisible by 11 and direction is 1
    {
        increment curPlayer
    }
    else if i is divisible by 11
    {
        decrement curPlayer
    }

    if direction is 1
    {
        increment curPlayer
    }
    else
    {
        decrement curPlayer
    }

    if curPlayer is larger than 10 {
        subtract 10 from curPlayer
    }

    if curPlayer is less than 1 {
        add 10 to curPlayer
    }
}

return curPlayer
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29634292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档