Διαδρομές
/
Factor
Factor
/
Ασκήσεις
/
Καταμέτρηση πουλιών στην αυλή
Καταμέτρηση πουλιών στην αυλή

Καταμέτρηση πουλιών στην αυλή

Άσκηση εκμάθησης

Εισαγωγή

Τις περισσότερες φορές το Factor χειρίζεται την επανάληψη μέσω συνδυαστών όπως τα each, map και count. Μερικές φορές όμως, ο πιο καθαρός τρόπος να εκφράσεις έναν υπολογισμό είναι η αναδρομή: μια λέξη που καλεί τον εαυτό της.

Ορισμός μιας αναδρομικής λέξης

Ένας ορισμός : μπορεί να καλέσει τον εαυτό του απευθείας:

: count-down ( n -- )
    dup 0 = [ drop ] [ dup . 1 - count-down ] if ;

5 count-down
! prints 5 4 3 2 1

Διακλάδωση: κενή ή όχι

Το if-empty (στο sequences) είναι η φυσική βασική περίπτωση της αναδρομής:

if-empty ( seq emptyquot nonemptyquot -- )
{ 4 0 9 } [ "empty" ] [ "got data" ] if-empty .
! => "got data"

Το emptyquot εκτελείται αφού η (κενή) ακολουθία έχει ήδη καταναλωθεί· το nonemptyquot εκτελείται με την ακολουθία ακόμα στη στοίβα.

cond: μια αλυσίδα διακλαδώσεων με συνθήκες

Όταν η αναδρομή σου έχει περισσότερες από δύο περιπτώσεις, το cond (στο combinators) κρατάει τον κώδικα ευανάγνωστο:

: classify ( n -- label )
    {
        { [ dup 0 < ] [ drop "negative" ] }
        { [ dup 0 = ] [ drop "zero"     ] }
        [ drop "positive" ]
    } cond ;

Μπροστινές αναφορές με DEFER:

Ένας ορισμός : μπορεί να καλέσει τον εαυτό του απευθείας, αλλά όταν δύο λέξεις καλούν η μία την άλλη, ο αναλυτής βλέπει την πρώτη πριν υπάρξει η δεύτερη. Το DEFER: δεσμεύει ένα όνομα ώστε ο πρώτος ορισμός να μπορεί να μεταγλωττιστεί:

DEFER: even?

: odd? ( n -- ? ) dup 0 = [ drop f ] [ 1 - even? ] if ;
: even? ( n -- ? ) dup 0 = [ drop t ] [ 1 - odd? ] if ;

Το DEFER: είναι επίσης χρήσιμο όταν μια βοηθητική λέξη διαβάζεται πιο φυσικά μετά τη λέξη που τη χρησιμοποιεί.

Οδηγίες

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

1. Η σημερινή μέτρηση

Όρισε τη today ώστε να παίρνει από τη στοίβα έναν πίνακα με τις καθημερινές μετρήσεις και να επιστρέφει τη σημερινή μέτρηση, ή f αν ο πίνακας είναι κενός.

{ 2 5 1 } today .
! => 2

{ } today .
! => f

2. Αύξησε τη σημερινή μέτρηση

Όρισε τη increment-day-count ώστε να επιστρέφει έναν νέο πίνακα με τη σημερινή μέτρηση αυξημένη κατά ένα. Αν η είσοδος είναι κενή, επέστρεψε { 1 }.

{ 4 0 2 } increment-day-count .
! => { 5 0 2 }

{ } increment-day-count .
! => { 1 }

3. Υπήρξε μέρα χωρίς πουλιά;

Όρισε τη has-day-without-birds? ώστε να επιστρέφει t αν τουλάχιστον μία μέρα κατέγραψε μηδέν πουλιά, αλλιώς f.

Χρησιμοποίησε αναδρομή αντί για any? ή άλλες λέξεις ανώτερης τάξης για ακολουθίες.

{ 2 0 4 } has-day-without-birds? .   ! => t
{ 3 8 1 5 } has-day-without-birds? . ! => f

4. Σύνολο πουλιών από τότε που ξεκίνησες

Όρισε τη total ώστε να επιστρέφει το άθροισμα όλων των μετρήσεων.

Χρησιμοποίησε αναδρομή αντί για sum.

{ 4 0 9 0 5 } total .
! => 18

5. Πολυάσχολες μέρες

Μια πολυάσχολη μέρα είναι αυτή με πέντε ή περισσότερα πουλιά. Όρισε τη busy-days ώστε να επιστρέφει τον αριθμό των πολυάσχολων ημερών.

Χρησιμοποίησε αναδρομή αντί για count.

{ 4 5 0 0 6 } busy-days .
! => 2
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Factor Exercism

Έτοιμος να ξεκινήσεις την άσκηση Καταμέτρηση πουλιών στην αυλή;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Factor με 47 έννοιες163 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.