Nested loops result

后端 未结 3 768
星月不相逢
星月不相逢 2021-01-24 01:03

I really don\'t know how to find out the result of nested loops. For example in the following pseudo-code, I can\'t sort out what will be given at the end of execution. I\'ll b

相关标签:
3条回答
  • 2021-01-24 01:21

    In your pseudo-code, Inner most loop, k <- j to i+j can be written as k <- 0 to i (this is by removing j). Hence your code can be simplified as follows:

    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
    

    Based on this pseudo-code, I have written a C program(as below) to generate sequence for N = 1 to 10. (you originally tagged question as java but I am writing c code because what you wants is independent of language constraints)

    #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");
    }
    

    Output of this program is something like:

     $ ./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
    

    Then, Tried to explore, How does it work? with some diagrams:

    Execution Tree For 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 )
    

    That is (1*2) = 2

    Tree For 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        )
    

    That is (1 + 1) + (3 + 3) = 8

    Similarly I drawn a tree for 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++
    

    That is (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  
    

    For N=6 we can also be write above sequence as:

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

    Finally, I could understand that sum of N in three loop is:

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

    With help from math.stackexchange.com, I could simplify this equation:
    I asked here: How to simplify summation equation in terms of N?

    image

    So as I commented to your question, Result in term of N is ( ((N) * (N+1) * (N+2)) / 3 ).
    And, I think its correct. I cross checked it as follows:

    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    
    
    0 讨论(0)
  • 2021-01-24 01:26

    Try using some code like this to work it out... i.e. code up what it is and what you think it should be and test it.

    EDIT: updated based on comment above.

    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;
    
      }
    
    }
    

    Running this gets

    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
    

    so we're happy.

    0 讨论(0)
  • 2021-01-24 01:39

    I am getting it something like this :

    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
    

    lets say for 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)
    

    Intuitively, I think

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

    where

    sum(n-1) = value of r for n-1
    
    0 讨论(0)
提交回复
热议问题