The foo function is a recursive function. Let's trace foo(15, 15, 10):
foo(15, 15, 10):
x=15, y=15, q=10. Neither x<=0 nor y<=0.
- Returns
foo(15, 15-10, 10) + foo(15-10, 15, 10)
- Returns
foo(15, 5, 10) + foo(5, 15, 10)
foo(15, 5, 10):
x=15, y=5, q=10. Neither x<=0 nor y<=0.
- Returns
foo(15, 5-10, 10) + foo(15-10, 5, 10)
- Returns
foo(15, -5, 10) + foo(5, 5, 10)
foo(15, -5, 10):
x=15, y=-5, q=10. y<=0 is true.
- Returns
foo(15-10, -5, 10)
- Returns
foo(5, -5, 10)
foo(5, -5, 10):
x=5, y=-5, q=10. y<=0 is true.
- Returns
foo(5-10, -5, 10)
- Returns
foo(-5, -5, 10)
foo(-5, -5, 10):
x=-5, y=-5, q=10. x<=0 and y<=0 are true.
- Returns
q which is 10.
So, foo(5, -5, 10) returns 10.
Then foo(15, -5, 10) returns 10.
Now, back to foo(15, 5, 10):
foo(15, 5, 10) returns 10 + foo(5, 5, 10)
foo(5, 5, 10):
x=5, y=5, q=10. Neither x<=0 nor y<=0.
- Returns
foo(5, 5-10, 10) + foo(5-10, 5, 10)
- Returns
foo(5, -5, 10) + foo(-5, 5, 10)
foo(5, -5, 10) returns 10 (as calculated above).
foo(-5, 5, 10):
x=-5, y=5, q=10. x<=0 is true.
- Returns
foo(-5, 5-10, 10)
- Returns
foo(-5, -5, 10) which returns 10.
So, foo(-5, 5, 10) returns 10.
Then foo(5, 5, 10) returns 10 + 10 = 20.
Now, back to foo(15, 5, 10):
foo(15, 5, 10) returns 10 + 20 = 30.
Now, back to foo(15, 15, 10):
foo(15, 15, 10) returns 30 + foo(5, 15, 10)
foo(5, 15, 10):
x=5, y=15, q=10. Neither x<=0 nor y<=0.
- Returns
foo(5, 15-10, 10) + foo(5-10, 15, 10)
- Returns
foo(5, 5, 10) + foo(-5, 15, 10)
foo(5, 5, 10) returns 20 (as calculated above).
foo(-5, 15, 10):
x=-5, y=15, q=10. x<=0 is true.
- Returns
foo(-5, 15-10, 10)
- Returns
foo(-5, 5, 10) which returns 10.
So, foo(-5, 15, 10) returns 10.
Then foo(5, 15, 10) returns 20 + 10 = 30.
Finally, foo(15, 15, 10) returns 30 + 30 = 60.
The program prints 60.