Helsingin yliopisto / tietojenkäsittelytieteen osasto / Ohjelmointikielten periaatteet / © Arto Wikla 2019

Ohjelmointikielten periaatteet: 3. harjoitukset 21.11.

Muutettu viimeksi 13.11.2019. Sivu luotu 13.11.2019.

Vastaajan arvonta —>

  1. Luennolla tarkasteltiin kertoman laskevaa rekursiivista funktiota ja sen muunnosta häntärekursiiviseksi. Materiaalissa esitettin myös vastaavat funktiot Fibonaccin luvun laskentaan:

    Perusmuoto:

       int fib (int n) {
         if (n == 0 || n==1)
           return 1;
         else
           return fib(n-1) + fib(n-2);
       }
    
    Muokattu versio:
       int fibrc (int n, int res1, int res2) {
         if (n == 0 || n==1 )
           return res2;
         else
           return fibrc(n-1,res2, res1+res2);
       }
    
       int fib (int n) {return fibrc(n, 1, 1)}
    

    a) Miksi ensinmainittu ei ole häntärekursiivinen?
    b) Miksi jälkimmäinen on häntärekursiivinen?
    c) Simuloi aktivaatiotietuepinon käytös ensimmäisen version suorituksessa jollain sopivalla (so. riittävän pienellä) argumentilla.
    d) Simuloi aktivaatiotietuepinon käytös toisen version suorituksessa jollain sopivalla (so. riittävän pienellä) argumentilla, kun häntärekursriota ei käytetä hyväksi.
    e) Simuloi aktivaatiotietuepinon käytös toisen version suorituksessa jollain sopivalla (so. riittävän pienellä) argumentilla, kun häntärekursio otetaan huomioon pinon käsittelyssä. .

  2. (kurssikirjan tehtävät 4.6.6 ja 4.6.7 modifioituina)

    1. Say what will be printed by the following code fragment written in a pseudo-language which uses static scope; the parameters are passed by a value (Javan tapaan!).
          int x = 2;
      
          int fie(int y) {
             x = x + y;
          }
       
          { int x = 5;
            fie(x);
            write(x);
          }
      
          write(x);
      

    2. Say what is printed by the code in the previous exercise if it uses dynamic scope [poistettu osa].

  3. (kurssikirjan tehtävä 6.8.1)
    Define, in any programming language, a function, f, such that the evaluation of the expression (a+f(b))*(c+f(b)) when performed from left-to-right has a result that differs from that obtained by evaluating right-to-left.

  4. (kurssikirjan tehtävä 6.8.2)
    Show how the if-then-else construct can be used to simulate short-circuit evaluation of boolean expressions in a language which evaluates all operands before applying boolean operators.

  5. (kurssikirjan tehtävä 6.8.6)
    The following code fragment is written in a pseudo-language which admits bounded iteration (numerically controlled) expressed using the for construct.
       z=1;
       for i=1 to 5+z by 1 do {
         write(i);
         z++;
       }
       write(z);
    
    What is printed by write?

  6. Vertaile Javan ja Pythonin ratkaisuja seuraavissa teknisissä ratkaisuissa:
    1. aliohjelmien, metodien ja funktioiden muoto ja rakenne
    2. parametrivälityksen tekniikat
    3. poikkeusten käsittely