《像程序员一样思考》一书对头递归和尾递归描述的非常精彩,他举了两个例子,“火车站台数鹦鹉”和“上下级委托事宜”。
火车站台数鹦鹉是这样的:有几个连续的火车站台,每个值班人员可以与其直接相邻的站台电话联系,第一个站台如何知道所有站台出现的鹦鹉的总数?
给出了两种思路:
第一种:
步骤 1.站台 1 把看到的鹦鹉报告给站台2,并询问,“总鹦鹉数量是多少”。得到回答后,加上本身看到的数量作为最终结果。
步骤 2.站台 2 把看到的鹦鹉数量加上站台 1 传入的数量传给站台3,并询问,“总鹦鹉数量是多少?”。得到回答后,把这个答案传给站台 1.
步骤 3.站台 3 把看到的鹦鹉数量加上站台 2 传入的数量传给站台4,并询问,“总鹦鹉数量是多少?”。得到回答后,把这个答案传给站台 2.
......
步骤 n.站台 n 看到了 x 只鹦鹉,并把 n - 1 站台报告的数量相加,传给 n - 1 站台。
这种思路是我们常用的,