1*4947cdc7SCole Faust# Tests of Starlark recursion and while statement. 2*4947cdc7SCole Faust 3*4947cdc7SCole Faust# This is a "chunked" file: each "---" effectively starts a new file. 4*4947cdc7SCole Faust 5*4947cdc7SCole Faust# option:recursion 6*4947cdc7SCole Faust 7*4947cdc7SCole Faustload("assert.star", "assert") 8*4947cdc7SCole Faust 9*4947cdc7SCole Faustdef sum(n): 10*4947cdc7SCole Faust r = 0 11*4947cdc7SCole Faust while n > 0: 12*4947cdc7SCole Faust r += n 13*4947cdc7SCole Faust n -= 1 14*4947cdc7SCole Faust return r 15*4947cdc7SCole Faust 16*4947cdc7SCole Faustdef fib(n): 17*4947cdc7SCole Faust if n <= 1: 18*4947cdc7SCole Faust return 1 19*4947cdc7SCole Faust return fib(n-1) + fib(n-2) 20*4947cdc7SCole Faust 21*4947cdc7SCole Faustdef while_break(n): 22*4947cdc7SCole Faust r = 0 23*4947cdc7SCole Faust while n > 0: 24*4947cdc7SCole Faust if n == 5: 25*4947cdc7SCole Faust break 26*4947cdc7SCole Faust r += n 27*4947cdc7SCole Faust n -= 1 28*4947cdc7SCole Faust return r 29*4947cdc7SCole Faust 30*4947cdc7SCole Faustdef while_continue(n): 31*4947cdc7SCole Faust r = 0 32*4947cdc7SCole Faust while n > 0: 33*4947cdc7SCole Faust if n % 2 == 0: 34*4947cdc7SCole Faust n -= 1 35*4947cdc7SCole Faust continue 36*4947cdc7SCole Faust r += n 37*4947cdc7SCole Faust n -= 1 38*4947cdc7SCole Faust return r 39*4947cdc7SCole Faust 40*4947cdc7SCole Faustassert.eq(fib(5), 8) 41*4947cdc7SCole Faustassert.eq(sum(5), 5+4+3+2+1) 42*4947cdc7SCole Faustassert.eq(while_break(10), 40) 43*4947cdc7SCole Faustassert.eq(while_continue(10), 25) 44