请高手帮我解释一下汉诺塔游戏程序中的直接递归调用部分
program hanoitower(input,output);



   var  total:integer ;



   procedure movetower(h,f,t,u:integer);



     procedure movedisk(take,put:integer);



        begin



         writeln('    ',take:2,'........>',put:2)



     end;



begin



    if h>0 then



          begin



           movetower(h-1,f,u,t);



         movedisk(f,t);



        movetower(h-1,u,t,f)



     end;



end;



begin {main program}



    write('  input a number of disk');



   readln(total);



   writeln;



writeln('the trace for disks moving:');



writeln;



writeln('  from........to.........');



movetower(total,1,3,2);



end.



    其中红色部分我未看懂,我认为在 第一个递归调用处即"movetower(h-1,f,u,t)"程序会反复调用自己至到h=1为止,这样一来过程式“movedisk(f,t)"就只能调用一次所以只能输出一次结果,但是我运行了一下,可以输出正确结果,这说明程序本身是正确的只是我未看懂而已所以肯请大哥给我解释一下。