Кто-нибудь, пожалуйста, объясните, как эта программа выполняется? - PullRequest
0 голосов
/ 21 сентября 2010

ниже - программа на языке со статической областью действия:

program main
   int x, y;
   void p1(value int y, void q(reference int)) {
      void p2(reference int x) {
            x := y + 2;
            print(x);
            q(y);
            }
      if x = y then q(y) else p1(y+1, p2)
      }
   void p2(reference int x) {
        x := y + 2;
        print(x);
        }
   x := 2;
   y := x;
   p1(0, p2);
end main

«значением» означает параметр, передаваемый по значению, «ссылкой» по ссылке.

Будет ли вызов функции "q (y)" в p2 вызвать бесконечный цикл?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2010

Поскольку он статически ограничен, вы можете изменить имена переменных внутри функций, чтобы избежать путаницы, намеченной вопросом.Я заменяю y в p1 на p1y, p2 в p1 на p1p2, x в p1p2 на p1p2x и x в p2 на p2x (хотя теперь это выглядит еще страшнее).Я также немного изменил форматирование.

program main
  int x, y;
  void p1(value int p1y, void q(reference int)) {
    void p1p2(reference int p1p2x) {
      p1p2x := p1y + 2;
      print(p1p2x);
      q(p1y);
    }

    if x = p1y then {
      q(p1y);
    } else {
      p1(p1y+1, p1p2);
    }
  }

  void p2(reference int p2x) {
    p2x := y + 2;
    print(p2x);
  }

  x := 2;
  y := x;
  p1(0, p2);
end main

Так как это домашнее задание, вы сможете легко взять его отсюда, используя любые методы, которым вас научили (следуйте за исполнением строка за строкой, нарисуйте стек,так далее).Но окончательный ответ - да, он будет бесконечно повторяться, печатая 4 6 8 и т. Д.

1 голос
/ 21 сентября 2010

печатает 4. На Java:

import java.util.concurrent.atomic.AtomicInteger;

public class Test {

    public static void main(String... a) {
        new Test().run();
    }

    AtomicInteger x = new AtomicInteger(0);
    AtomicInteger y = new AtomicInteger(0);

    void run() {
        x.set(2);
        y.set(x.get());
        new P1().p1(new AtomicInteger(0), new P2());
    }

    interface Q {
        void q(AtomicInteger x);
    }

    class P2 implements Q {
        public void q(AtomicInteger x) {
            x.set(y.get() + 2);
            System.out.println(x.get());
         }
    }

    class P1 implements Q {
        public void q(AtomicInteger x) {
            x.set(y.get() + 2);
            System.out.println(x.get());
         }
        void p1(AtomicInteger y, Q q) {
            if (x.get() == y.get()) {
                q.q(y);
            } else {
                p1(new AtomicInteger(y.get()+1), this);
            }
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...