You need to step through your code and realize what it's actually doing. Your problem starts right when this loop first tries to execute.
Code:
for (int amount = 0; amount < r; amount++) {
cout << combinations(rows, r);
}
r comes from the outer loop and is initialized to zero, so you end up comparing amount < r or 0 < 0 which is false, so nothing happens.
Then you iterate and r becomes 1.
You enter combinations and the effect looks like this:
Code:
combinations(rows, r);
combinations(4, 1)
return combinations(4 - 1, 1 - 1) + combinations(4 - 1, 1)
return 1 + combinations(3, 1)
combinations(3, 1)
return combinations(3 - 1, 1 - 1) + combinations(3 - 1, 1)
return 1 + combinations(2, 1)
combinations(2, 1);
return 1 + combinations(2 - 1, 1);
combinations(1, 1)
return 1
So we have four 1 + somethings... that something eventually resolves into this = 1 + 1 + 1 + 1, which is 4, so you print 4.
It just gets worse from there. Try a different approach to the whole problem.