Solidity does not support optional parameters, but what it does support is method overrides. Just like in Java you can declare a function multiple times as long as the arity and/or types are different.
Example I tried on remix:
pragma solidity ^0.4.18;
contract Overload {
function calculate (uint _a, uint _b) public pure returns (uint) {
return _a + _b;
}
function calculate (uint _a, uint _b, uint _c) public pure returns (uint) {
return _a + _b + _c;
}
}
Here's a silly example with an internal function that both use, just to demonstrate reusable functionality:
pragma solidity ^0.4.18;
contract Overload {
function calculate (uint _a, uint _b) public pure returns (uint) {
return addTwo(_a, _b);
}
function calculate (uint _a, uint _b, uint _c) public pure returns (uint) {
return addTwo(addTwo(_a, _b), _c);
}
function addTwo(uint _a, uint _b) internal pure returns (uint) {
return _a + _b;
}
}