Параметры функции?
Потому что иначе невозможна рекурсия. Что если у вас f(1,3) захочет вызвать f(0,0). Еще придется эти глобальные переменные переписать и потом как-то восстанавливать, если после вызова f(1,3) еще что-то хочет делать с этими параметрами.

Потом, это тупо неудобно. Для каждой функции нужен свой набор глобальных переменных.

Это про второй ваш вариант.
В третьем же a и b локальные переменные. Получается вы их никак снаружи функции не сможете задать.

Кажется, у вас непонимае. Функции нужны не просто для того, чтобы распилить программу на меньшие логически обособленные блоки, но и для переиспользования этих блоков в разных ситуациях. Вот пример - функция вывода строки на экран. Она в качестве параметра принимает строку для вывода. Ее можно вызывать для разных строк. Иначе смысла в ней вообще нет. Вот зачем нужны параметры.
Зачем передавать переменные-параметры в функцию, если можно писать глобальное объявление переменных?
1. Чтобы избавлять от дублирования (ну вообще это сам смысл функций)
2. Чтобы удобнее работать с этими функциями (сразу видишь, что функция от тебя ждёт)
3. Чтобы нормально работало в многопоточной среде. (глобальные переменные и многопоток не совестимы)

Ну вот например менее абcтрактный пример:
int sum(int a, int b) { // всё отлично, всё понятно
  return a + b;
}

int a,b;
// Каким образом мы поймём, что надо перед вызовом sum задать какое-то значение переменным a и b?
// sum и её "параметры" a и b никак не связаны
int sum() {
  return a + b;
}

int sum() { // а как в этом случае нам сложить две переменные? Как задать значения a и b??????
  int a,b;
  return a + b;
}