xref: /aosp_15_r20/external/starlark-go/starlark/testdata/recursion.star (revision 4947cdc739c985f6d86941e22894f5cefe7c9e9a)
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