To solve the given optimization problem using Gurobi, we first need to understand and translate the natural language description into a mathematical formulation. The goal is to maximize the objective function that represents the total value of reconnaissance troops and light infantry companies, subject to several constraints related to their fun factors and other limitations.

Given:
- Objective Function: Maximize \(9 \times \text{reconnaissance troops} + 5 \times \text{light infantry companies}\)
- Constraints:
  1. Fun factor of reconnaissance troops: 8.6 per unit
  2. Fun factor of light infantry companies: 2.79 per unit
  3. Total combined fun factor should be greater than or equal to 45.
  4. \(9 \times \text{reconnaissance troops} - 5 \times \text{light infantry companies} \geq 0\)
  5. Maximum total combined fun factor: less than or equal to 83.
  6. Reconnaissance troops must be a non-fractional (integer) number.
  7. Light infantry companies must also be an integer number.

Let's denote:
- \(x_0\) as the number of reconnaissance troops
- \(x_1\) as the number of light infantry companies

The mathematical formulation is thus:
- Maximize: \(9x_0 + 5x_1\)
- Subject to:
  1. \(8.6x_0 + 2.79x_1 \geq 45\)
  2. \(9x_0 - 5x_1 \geq 0\)
  3. \(8.6x_0 + 2.79x_1 \leq 83\)
  4. \(x_0, x_1 \in \mathbb{Z}^+\) (both are positive integers)

Now, let's translate this into Gurobi code:

```python
from gurobipy import *

# Create a new model
m = Model("Optimization_Problem")

# Define variables
x0 = m.addVar(vtype=GRB.INTEGER, name="reconnaissance_troops")
x1 = m.addVar(vtype=GRB.INTEGER, name="light_infantry_companies")

# Objective function: Maximize 9*x0 + 5*x1
m.setObjective(9*x0 + 5*x1, GRB.MAXIMIZE)

# Constraints
m.addConstr(8.6*x0 + 2.79*x1 >= 45, name="min_fun_factor")
m.addConstr(9*x0 - 5*x1 >= 0, name="troops_vs_companies")
m.addConstr(8.6*x0 + 2.79*x1 <= 83, name="max_fun_factor")

# Solve the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Reconnaissance Troops: {x0.x}")
    print(f"Light Infantry Companies: {x1.x}")
    print(f"Objective Value: {m.objVal}")
else:
    print("No optimal solution found.")
```