This is actually not a crontab behavior; it's the behavior of
run-parts which is what executes the scripts in /etc/cron.hourly/, /etc/cron.daily/, and so on:
Quote:
If neither the --lsbsysinit option nor the --regex option is given then the names must consist entirely of upper and lower case letters, digits, underscores, and hyphens.
The reason is that there may be files in those directories that should not be executed (e.g., those ending in .dpkg-old or .dpkg-dist, or editor backup files ending in ~). It's just one of those quirks that you have to file away in the back of your head.
Note that you can create a symbolic link without a dot to a file with a dot, e.g.
ln -s /root/backup.sh /etc/cron.daily/backup and it will be run.