【问题标题】:Nested loops result嵌套循环结果
【发布时间】:2013-06-05 20:50:24
【问题描述】:

我真的不知道如何找出嵌套循环的结果。 例如在下面的伪代码中,我无法理清执行结束时会给出什么。如果有人给我一个简单的解决方案,我会很高兴。

r <- 0
for i <- 1 to n do 
  for j <- 1 to i do
    for k <- j to i+j do
      r <- r + 1
return r

问题是:

代码的结果是什么,并以n 的形式给出结果r?

我写了它,但每次我都感到困惑。

【问题讨论】:

  • 实现它并调试它。调试器会给你最好的解释。
  • @thejh no is not a hw... 我正在准备考试
  • 祝你考试顺利。
  • @NavidKoochooloo k &lt;- j to i+j 可以替换为 k &lt;- 0 to i 那么这个答案可能会有帮助 A puzzle related to nested loops r 将是 ( ((N) * (N+1) * (N+2)) / 3 )
  • 人们投票结束的问题,但它确实是算法问题的好问题。 (未本地化)

标签: loops for-loop pseudocode nested-loops


【解决方案1】:

尝试使用类似这样的代码来解决它......即编写它是什么以及你认为它应该是什么并对其进行测试。

编辑:根据上述评论更新。

public class CountLoop{

  public static void main(String[] args){

    for(int i=1;i<=10;i++)
      System.out.println("It's "+run(i)+" and I think "+guess(i));;

  }

  public static int run(int n){

    int r = 0;
    for(int i=1;i<=n;i++)
      for(int j=1; j <= i;j++)
        for(int k=j; k <= i+j; k++)
          r += 1;

    return r;

  }

  public static int guess(int n){

   // taken from the comments
   int r = ((n * (n+1) * (n+2)) /3);

   return r;

  }

}

运行这个得到

It's 2 and I think 2
It's 8 and I think 8
It's 20 and I think 20
It's 40 and I think 40
It's 70 and I think 70
It's 112 and I think 112
It's 168 and I think 168
It's 240 and I think 240
It's 330 and I think 330
It's 440 and I think 440

所以我们很高兴。

【讨论】:

  • 对不起,我不确定,尝试像我在链接示例中绘制的那样绘制树,你不会找到这个公式...
【解决方案2】:

我得到它是这样的:

n = 1: r = 2
n = 2: r = 8
n = 3: r = 20
n = 4: r = 40
n = 5: r = 70
n = 6: r = 112
n = 7: r = 168
n = 8: r = 240
n = 9: r = 330
n = 10: r = 440

让我们说n = 10,

r = 2 + 6 + 12 + 20 + 30 + 42 + 56 + 72 + 90 + 110 = 440
=> r = 2(1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + 45 + 55)

直觉上,我认为

n = sum(n-1) + n * (n + 1).

在哪里

sum(n-1) = value of r for n-1

【讨论】:

  • 要正确回答这个问题,您应该说明此输出的逻辑方式?
  • 我检查了你的链接答案。太棒了。我也达到了 1 + (1+2) + (1+2+3) + (1+2+3+4) + ......的地步,但是在我无法更合乎逻辑地弄清楚之后。所以我只是用我的直觉来寻找答案。我试图从上面给出的观点中理解你的回答。
  • 感谢我的回答 :),但您的回答中的一个错误 r = 2 + 6 + 12 + 20 应该是 r = 2 + 8 + 12 + 20 , 8 而不是 6。如果我画树,它就不同了。
  • 你的厕所。它应该是 2 + 6,因为它最终会给出 8。
  • 看,这段代码中发生的事情是:正如你在我的回答中看到的那样:r = 2 + 6 + 12 + 20 + 30 + 42 + 56 + 72 + 90 + 110 = 440 =&gt; r = 2(1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + 45 + 55) 所以,每次从 2 开始,它都会增加一个连续的数字。然后它会继续增加 3 ,4,5,6,7,...
【解决方案3】:

在您的伪代码最内层循环中,k &lt;- j to i+j 可以写成k &lt;- 0 to i(这是通过删除j)。因此,您的代码可以简化如下:

r <- 0
for i <- 1 to n do 
    for j <- 1 to i do
      for k <- 0 to i do   // notice here `j` removed
        r <- r + 1
return r

基于这个伪代码,我编写了一个 C 程序(如下所示)来生成 N = 1 到 10 的序列。(您最初将问题标记为 但我正在编写 代码,因为您想要独立于语言限制)

#include<stdio.h>
int main(){
  int i =0, k =0, j =0, n =0;
  int N =0; 
  int r =0;
  N =10;
  for (n=1; n <= N; n++){
  // unindented code here
  r =0;
  for (i=1; i<=n; i++)
      for (j=1; j<=i; j++)
          for (k=0; k<=i; k++)
              r++;    
  printf("\n N=%d  result = %d",n, r); 
  }
  printf("\n");
}

这个程序的输出是这样的:

 $ ./a.out     
 N=1  result = 2
 N=2  result = 8
 N=3  result = 20
 N=4  result = 40
 N=5  result = 70
 N=6  result = 112
 N=7  result = 168
 N=8  result = 240
 N=9  result = 330
 N=10  result = 440

然后,尝试探索,它是如何工作的?用一些图表:

N=1 的执行树:

1<=i<=1,              (i=1)
                        |
1<=j<=i,              (j=1)
                      /   \
0<=k<=i,          (K=0)    (K=1)
                   |        |  
r=0                r++      r++    => r = 2
                 ( 1   +    1 )

那是(1*2) = 2

N=2 的树:

1<=i<=2,         (i=1)-----------------------(i=2)
                  |                 |---------|------|
1<=j<=i,        (j=1)           (j=1)              (j=2)
                /   \          /  |  \            /  |  \
0<=k<=i,    (K=0)    (K=1)  (K=0)(K=1)(k=2)    (K=0)(K=1)(k=2)
              |        |      |     |    |       |     |    |
r=0          r++      r++   r++   r++  r++     r++   r++  r++    => 8
            --------------  ---------------------------------
            ( 1   +    1)   (     3         +      3        )

那是(1 + 1) + (3 + 3) = 8

同样我为N=3画了一棵树:

1<=i<=3,        (i=1)-----------------------(i=2)--------------------------------------------(i=3)
                  |                 |---------|------|                  |----------------------|----------------------|
1<=j<=3,        (j=1)             (j=1)            (j=2)            (   j=1   )           (   j=2    )           (   j=3    )
                /   \            /  |  \          /  |  \          / |       |  \        / |       |  \          / |       | \
0<=k<=i,    (K=0)   (K=1)    (K=0)(K=1)(k=2)   (K=0)(K=1)(k=2)    /  |       |   \      /  |       |   \        /  |       |  \
              |       |        |    |    |       |    |    |     (K=0)(K=1)(k=2)(k=3)  (K=0)(K=1)(k=2)(k=3)  (K=0)(K=1)(k=2)(k=3)
r=0          r++     r++      r++  r++  r++     r++  r++  r++     r++  r++   r++  r++   r++  r++  r++  r++   r++  r++   r++   r++

那是(1 + 1) + (3 + 3) + (4 + 4+ 4)= 20

N = 1,   (1 + 1) = 2  
N = 2,   (1 + 1) + (3 + 3) = 8  
N = 3,   (1 + 1) + (3 + 3) + (4 + 4 + 4)= 20  
N = 4,   (1 + 1) + (3 + 3) + (4 + 4 + 4) + (5 + 5 + 5 + 5)  =  40  
N = 5,   (1 + 1) + (3 + 3) + (4 + 4 + 4) + (5 + 5 + 5 + 5) + (6 + 6 + 6 + 6 + 6) = 70  
N = 6,   (1 + 1) + (3 + 3) + (4 + 4 + 4) + (5 + 5 + 5 + 5) + (6 + 6 + 6 + 6 + 6) + (7 + 7 + 7 + 7 + 7 + 7)= 112  

对于 N=6,我们也可以将上面的序列写为:

(1*2) + (2*3) + (3*4) + (4*5) + (5*6) + (6*7)    

最后,我可以理解三个循环中N 的总和是:

(1*2) + (2*3) + (3*4) + (4*5) + (5*6) + ... + (N * (N+1))

在 math.stackexchange.com 的帮助下,我可以简化这个等式:
我在这里问:How to simplify summation equation in terms of N?

正如我对您的问题的评论,N 的结果是( ((N) * (N+1) * (N+2)) / 3 )。
而且,我认为它是正确的。我交叉检查如下:

N = 1,    (1 * 2 * 3)/3  = 2

N = 2,    (2 * 3 * 4)/3 =  8

N = 3,    (3 * 4 * 5)/3 =  20

N = 4,    (4 * 5 * 6)/3 =  40

N = 5,    (5 * 6 * 7)/3 =  70    

【讨论】:

  • 我可以不将 k
  • @NavidKoochooloo 是的,我将k &lt;- j to i+j 替换为k &lt;- 0 to i,
  • (1+1)+(3+3) ? 为此请注意我为N=2 绘制的树,对于j=2 有3+3 r++ ...请再次阅读答案.
  • 人们投票不赞成/反对,因为看起来他没有付出任何努力。尽管如此,这是一个很好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2015-10-14
相关资源
最近更新 更多