2.3 执行动作的递归(3)
注释:cout语句有助于跟踪递归函数的逻辑
图2-8和图2-9显示修改后的伪代码函数writeBackward和writeBackward2的输出。最初给定的字符串为"cat"。

应该准确把握上述两种函数的区别。对于参数s,这两个函数的递归调用生成了不同的值序列。尽管如此,两个函数都正确地逆置了字符串参数。这两个函数针对不同的递归调用,在不同的时间输出了不同的字符,从而弥补了s值序列的差异。由图2-8和图2-9的箱式跟踪可知,writeBackward在生成新箱(新递归调用)前输出一个字符,而writeBackward2在取消箱(从递归调用返回)后输出一个字符。两个函数殊途同归,用不同策略完成相同任务。
这个示例还演示了在调试递归函数时,如何将箱式跟踪与合适的cout语句配合。cout语句出现在递归函数的开始、中间以及结尾以报告参数s的值。通常,当调试递归函数时,还应该报告局部变量的值以及函数中发生递归调用的位置,如下所示:
- abc(...);
- cout << "Calling function abc from point A.\n";
- abc(...) // This is point A
- cout << "Calling function abc from point B.\n";
- abc(...); // This is point B
注释:位置合适的临时cout语句可以辅助调试递归函数
要注意,cout语句不应出现在函数的最终版本中。
注释:当调试完函数之后,应该删除cout语句
问题3 给定整数n>0,编写递归函数countDown输出n,n-1,…,1。提示:哪些任务可以自己完成?哪些任务可以交给朋友去做?
