-4

谁能帮我解决这个问题?我不知道如何解决它,甚至不知道如何开始。

下面的代码段是一个从 1 到 5 的计数控制循环。在每次迭代中,循环计数器要么被打印,要么被放入队列中,具体取决于方法 random(假设 random 随机返回 true 或 false )。

在循环结束时,队列中的元素被删除并打印。由于队列的逻辑属性,此代码段无法打印循环计数器值的某些序列。您将获得一个输出,并要求您确定代码段是否可以生成输出。

for(count = 1; count <= 5; count++) {
   if(random())
      system.out.println(count);
   else 
      queue.enqueue(count);  
}
while (!queue.isEmpty())
{
   number = queue.dequeue();
   system.out.println(number);
}
  1. 以下是可能的: 1 2 3 4 5
    真、假或信息不足?

  2. 以下是可能的: 1 3 5 4 2
    真、假或信息不足?

  3. 以下是可能的: 1 3 5 2 4
    真、假或信息不足?

4

4 回答 4

3

我不知道如何解决它,甚至不知道如何开始。

以下是关于如何开始的建议:

使用笔和纸,模拟程序的多次运行(随机选择两个分支之一,而不是每次random()调用),看看是否发现任何规律。即使您不这样做,代码中也只有 32 条不同的路径。

于 2013-04-06T15:03:03.153 回答
0

这令人困惑。查看控制台,如果 random() 为真,我将打印出计数。否则我会把它排入队列。然后我将在最后打印出队列,在不知道实际顺序的情况下打印出包含 1-5 在内的每个数字。让队列中的 println 看起来像这样会更有用: System.out.println("Queue " + number);

于 2013-04-06T15:04:13.210 回答
0

一种。 真的。这是random()返回true 5 次的情况(这将以 0.03125 的概率发生)

湾。让我们假设这是真的

可能的情况:

i = 1 random()返回true所以它打印 1。

然后,为了使b如我们假设的那样为真,i = 2它必须random()返回false(否则程序将打印 1 与我们的假设相矛盾)。

因此,我们将使用 else 语句并入队 1。

对于i = 3.

现在我们要打印 4,假设random()返回true

所以,在队列中我们有: 2 3 5

.. 继续这样想,你就会知道答案。

解决这个问题的关键是假设:

无论何时,您都可以假设它random()是真/假。

于 2013-04-06T15:06:56.100 回答
0

您的循环从 1 变为 5。但是,任何数量的这些都可以放入队列并在最后打印。

因此,存在三种明确的情况:

  1. 所有条目都已打印(没有排队)。您将获得 12345。
  2. 所有条目都排队。您将再次获得 12345。
  3. 打印了一些条目 - 一些条目已排队。

在情况 3 中,显然您将得到两个递增序列,其中第一个序列中缺少的数字出现在第二个序列中

所以,现在你可以看到会发生什么,我建议你开始考虑如何识别这些。

于 2013-04-06T15:16:17.090 回答