Κεφάλαιο 12. Παράδειγμα προγραμμάτων στην GEL
Προηγ |  | Επόμενο

# Κεφάλαιο 12. Παράδειγμα προγραμμάτων στην GEL

Ιδού μια συνάρτηση που υπολογίζει παραγοντικά:

    function f(x) = if x <= 1 then 1 else (f(x-1)*x)

Με παραγραφοποίηση γίνεται:

    function f(x) = (
      if x <= 1 then
        1
      else
        (f(x-1)*x)
    )

Αυτή είναι η άμεση θύρα της παραγοντικής συνάρτησης από τη σελίδα εγχειριδίου bc. Η σύνταξη φαίνεται παρόμοια με την bc, αλλά διαφέρει στο ότι στην GEL η τελευταία παράσταση είναι αυτή που επιστρέφεται. Χρησιμοποιώντας τη συνάρτηση `return`, θα πρέπει να είναι:

    function f(x) = (
      if (x <= 1) then return (1);
      return (f(x-1) * x)
    )

Ο ευκολότερος τρόπος να οριστεί μια παραγοντική συνάρτηση είναι χρησιμοποιώντας τον βρόχο γινομένου όπως ακολουθεί. Αυτό δεν είναι μόνο ο πιο σύντομη και ο γρήγορη, αλλά επίσης η πιο αναγνώσιμη έκδοση.

    function f(x) = prod k=1 to x do k

Ιδού ένα μεγαλύτερο παράδειγμα, αυτό βασικά ξαναορίζει την εσωτερική συνάρτηση `ref` για να υπολογίσει τη μορφή κλιμακωτής γραμμής ενός πίνακα. Η συνάρτηση `ref` είναι ενσωματωμένη και πολύ γρηγορότερη, αλλά αυτό το παράδειγμα δείχνει μερικά πιο σύνθετα γνωρίσματα της GEL.

    # Calculate the row-echelon form of a matrix
    function MyOwnREF(m) = (
      if not IsMatrix(m) or not IsValueOnly(m) then
        (error("MyOwnREF: argument not a value only matrix");bailout);
      s := min(rows(m), columns(m));
      i := 1;
      d := 1;
      while d <= s and i <= columns(m) do (

        # This just makes the anchor element non-zero if at
        # all possible
        if m@(d,i) == 0 then (
          j := d+1;
          while j <= rows(m) do (
            if m@(j,i) == 0 then
              (j=j+1;continue);
            a := m@(j,);
            m@(j,) := m@(d,);
            m@(d,) := a;
            j := j+1;
            break
          )
        );
        if m@(d,i) == 0 then
          (i:=i+1;continue);

        # Here comes the actual zeroing of all but the anchor
        # element rows
        j := d+1;
        while j <= rows(m)) do (
          if m@(j,i) != 0 then (
            m@(j,) := m@(j,)-(m@(j,i)/m@(d,i))*m@(d,)
          );
          j := j+1
        );
        m@(d,) := m@(d,) * (1/m@(d,i));
        d := d+1;
        i := i+1
      );
      m
    )

Προηγ |  | Επόμενο
Γραφική παράσταση | Αρχή | Κεφάλαιο 13. Ρυθμίσεις