Delbruck on the Pyrrhic War:
But the accounts of the Pyrrhic War, even though they go back to originally valid witnesses, have come to us third-hand, so that there is so little we can do to test their sources and to separate them from the accompanying fables and legends that none of the facts may be considered as completely reliable.
Warfare in Antiquity, 297.
The Battle of Heraclea is so confused and out of touch with reality that we can't even retell is with even some level of consistency. I thought the casualties for the Romans in that battle ranged from 7,000 to 15,000, according to the sources? The following battles are even more difficult to make out.
The thing you're forgetting is that if Rome didn't happen to follow Fabius and his strategy, Hannibal may well have won over many of Rome's allies, or at least more than he did during the actual war. But he did get Capua, the second largest city in Italy, to come over to him, which is impressive in of itself. Hannibal certainly wasn't waging a war of annihilation, either.
Hannibal was obviously aware of some of the potential of Rome in its heartland, but he also knew about the tactical superiority of his officers and soldiers, and that there was realistically no other option in the war but to attack Italy if any real settlement in Carthage's favor was to be achieved.
It was only after a tremendous amount of time that the Romans, or rather, Scipio, finally adjusted the Roman army to a tactical flexibility comparable to that of Hannibal's army. And this was at the end of the war. Of course Scipio is going to do a lot better when Carthage has been at the war for such an extended period of time, which was already structurally weak compared to the relationship between Rome and its allies. It didn't levy citizens, it relied on mercenaries. And of course Scipio is going to do a lot better with the lessons of Hannibal's war tucked under his belt.
Both Plutarch and Livy attest that Hannibal held Pyrrhus as, at the very least, a great general. At best, he considered Phyrrhus to be the second greatest general. Certainly, he was aware of Phyrrus's victories over Rome, and the eventual victory of Roman strategic stamina over dramatic tactical victories.
With even more certainty, Hannibal must have been aware of how Rome out-resourced Carthage in the First Punic War: constant building, then rebuilding, massive fleets of warships. This was something Carthage struggled to do. Although details on the First Punic War are harder to come by than the Second, it is well established that the Roman Navy built it self, and rebuilt it self, at least twice. This is a strong indicator of economic strategic stamina and an institutional culture of "not giving up."
Given the available facts, it is not asking too much of Hannibal to have learned the very important lesson of Rome's strategic stamina, and the will of its people (which was similar to British refusal to "never surrender" in 1803-1805 and 1940-1941). And if he was not aware of this, he failed as a general.
This is not to say Hannibal was a bad general, or that he was not great: he was among the best generals in history. But he had his failings, and Scipio didn't learn his brilliant, big picture strategies such as using the Carthaginian Senate against him and economically draining Carthage by conquering Spain from Hannibal. Scipio is often underestimated because he fought Hannibal at great advantage. What many fail to understand (and I do not believe that you, Valentino, are among these people) is that Scipio only fought Hannibal at great advantage because he deliberately set things up that way in a broad, strategic sense. Just as the attack of Bulow's corps at Waterloo was a deliberate, six-hour flanking maneuver on the part of Wellington, Scipio deliberately drew Hannibal to Africa and forced him to fight before he was ready: Hannibal did not want to march to face Scipio as soon as he did, and he only did so at the Carthaginian' Senate's insistence because Scipio was ravaging the countryside (a fairly justified act given that Carthage broke the truce, in addition to being strategically sound).
It is said that a truly great general attains victory before the battle begins. Scipio certainly did this, not only winning the battle before the battle started, but arguably the war by forcing Hannibal into a tactically unfeasible position. An anecdote regarding Marius related in Goldsworthy's book about Roman Generals sums things up nicely:
During the Social War, Marius refused to give battle to his enemy, who taunted, "Come fight me Marius, if you are a great general!" To which Marius replied, "And if
you are a great general, force me to fight even if I don't want to!"
Which is exactly what Scipio did.