2.3 执行动作的递归(3)

2014-03-11 13:04:45 · 作者: · 浏览: 123

2.3  执行动作的递归(3)

注释:cout语句有助于跟踪递归函数的逻辑

图2-8和图2-9显示修改后的伪代码函数writeBackward和writeBackward2的输出。最初给定的字符串为"cat"。

 

 

应该准确把握上述两种函数的区别。对于参数s,这两个函数的递归调用生成了不同的值序列。尽管如此,两个函数都正确地逆置了字符串参数。这两个函数针对不同的递归调用,在不同的时间输出了不同的字符,从而弥补了s值序列的差异。由图2-8和图2-9的箱式跟踪可知,writeBackward在生成新箱(新递归调用)前输出一个字符,而writeBackward2在取消箱(从递归调用返回)后输出一个字符。两个函数殊途同归,用不同策略完成相同任务。

这个示例还演示了在调试递归函数时,如何将箱式跟踪与合适的cout语句配合。cout语句出现在递归函数的开始、中间以及结尾以报告参数s的值。通常,当调试递归函数时,还应该报告局部变量的值以及函数中发生递归调用的位置,如下所示:

  1. abc(...);  
  2. cout << "Calling function abc from point A.\n";  
  3. abc(...) // This is point A  
  4. cout << "Calling function abc from point B.\n";  
  5. abc(...); // This is point B 

注释:位置合适的临时cout语句可以辅助调试递归函数

要注意,cout语句不应出现在函数的最终版本中。

注释:当调试完函数之后,应该删除cout语句

问题3 给定整数n>0,编写递归函数countDown输出n,n-1,…,1。提示:哪些任务可以自己完成?哪些任务可以交给朋友去做?