It is possible to do this, but I strongly recommend against it. Most often, this kind of programming leads to bad design and is difficult to debug. Shenghui's suggestion is the best way to do this kind of thing.
To answer your question, you can define your functions all at once by evaluating:
Do[Symbol["f" <> ToString[i]][x_] := Evaluate[x + i], {i, 1, 50}]