A legtöbbször a Factor az iterációt olyan kombinátorokkal oldja meg, mint az each, a map és a count. Néha viszont a legtisztább módja egy számítás leírásának a rekurzió: egy szó, ami önmagát hívja.
Egy : definíció közvetlenül hívhatja önmagát:
: count-down ( n -- )
dup 0 = [ drop ] [ dup . 1 - count-down ] if ;
5 count-down
! prints 5 4 3 2 1
Az if-empty (a sequences része) a rekurzió természetes alapesete:
if-empty ( seq emptyquot nonemptyquot -- )
{ 4 0 9 } [ "empty" ] [ "got data" ] if-empty .
! => "got data"
Az emptyquot úgy fut le, hogy a (üres) sorozatot már elhasználta; a nonemptyquot pedig úgy, hogy a sorozat még a vermen van.
cond: őrzött ágak láncolataAmikor a rekurziódnak kettőnél több esete van, a cond (a combinators része) segít, hogy a kód olvasható maradjon:
: classify ( n -- label )
{
{ [ dup 0 < ] [ drop "negative" ] }
{ [ dup 0 = ] [ drop "zero" ] }
[ drop "positive" ]
} cond ;
DEFER: segítségévelEgy : definíció közvetlenül hívhatja önmagát, de amikor két szó egymást hívja, a Factor az elsőt már azelőtt látja, hogy a második létezne. A DEFER: lefoglal egy nevet, hogy az első definíció le tudjon fordulni:
DEFER: even?
: odd? ( n -- ? ) dup 0 = [ drop f ] [ 1 - even? ] if ;
: even? ( n -- ? ) dup 0 = [ drop t ] [ 1 - odd? ] if ;
A DEFER: akkor is hasznos, ha egy segédszót természetesebb az őt használó szó után olvasni.
Napi darabszámokat vezetsz arról, hány madár látogatja meg a kertedet. Az adatokat egész számok tömbjeként tároljuk, ahol az első elem a mai nap darabszáma.
Definiáld a today szót úgy, hogy levegyen a veremről egy napi darabszámokat tartalmazó tömböt, és adja vissza a mai nap darabszámát, vagy f-et, ha a tömb üres.
{ 2 5 1 } today .
! => 2
{ } today .
! => f
Definiáld az increment-day-count szót úgy, hogy adjon vissza egy új tömböt, amelyben a mai nap darabszáma eggyel megnőtt. Ha a bemenet üres, akkor { 1 }-et adjon vissza.
{ 4 0 2 } increment-day-count .
! => { 5 0 2 }
{ } increment-day-count .
! => { 1 }
Definiáld a has-day-without-birds? szót úgy, hogy adjon vissza t-t, ha legalább egy napon nulla madarat számoltál, egyébként f-et.
Használj rekurziót az any? vagy más magasabb rendű sorozatszavak helyett.
{ 2 0 4 } has-day-without-birds? . ! => t
{ 3 8 1 5 } has-day-without-birds? . ! => f
Definiáld a total szót úgy, hogy adja vissza az összes darabszám összegét.
Használj rekurziót a sum helyett.
{ 4 0 9 0 5 } total .
! => 18
Egy forgalmas nap az, amikor öt vagy több madár járt nálad. Definiáld a busy-days szót úgy, hogy adja vissza a forgalmas napok számát.
Használj rekurziót a count helyett.
{ 4 5 0 0 6 } busy-days .
! => 2
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Factor nyelvet 47 fogalom163 feladat segítségével, valódi emberi mentorálással, mindez ingyen.