假设我有这样的东西:(预测输出)
void abc (char *s){
if(s[0]=='\0')
return;
abc(s+1);
abc(s+1);
printf(“%c “, s[0]);
}
这并不难解决,但是我花了太多的时间来做,而且我不得不重复2-3次这样的问题,因为我忘记了变量的递归和值(特别是当有2-3个这样的递归语句时)
当必须解决这些问题时,有什么好的方法可以使用吗?
发布于 2013-08-22 18:35:12
基本技术是首先从一小部分输入开始。然后试着用一个更大的。然后试着用一个更大的。对于递归函数,应该出现一种模式,让您在知道前一个函数的外观的情况下预测下一个函数的外观。
所以,让我们从一个空字符串开始。很简单,什么都没有打印出来。
input: ""
output:
接下来是一个长度为1的字符串。几乎同样简单的是,两个递归调用都不做任何事情(空字符串的情况),然后打印字符串的字符。
input: "z"
output: z
接下来是一个长度为2的字符串。每次递归调用都会打印第二个字符(长度为一个大小写的字符串),然后打印第一个字符。
input: "yz"
output: zzy
因此,让我们尝试预测长度为3的字符串的情况。将发生的情况是,不包括第一个字符的子字符串被处理两次,然后打印第一个字符。该子字符串是长度为两种情况的字符串。所以:
input: "xyz"
output: zzyzzyx
因此,现在应该很清楚如何在给定当前输出序列的情况下导出下一个输出序列。
发布于 2013-08-22 18:38:36
拿一叠适当大小的索引卡。开始跟踪对递归函数的初始调用。迟早你会(除非你在追踪一个无限递归)跟踪一个不进行递归调用的调用的执行,在这种情况下,将返回值复制回你原来的卡片。
在卡片上包括“转到卡片X”和“来自卡片Y”可能是个好主意。
在复杂的情况下,你可能会发现创建一个以上的卡片堆栈来跟踪你的函数调用是很有用的,哦,为什么不叫它们调用堆栈呢?
发布于 2013-08-22 18:40:03
分析递归最简单的例子是Fibonacci and Factorial function。
这将帮助您以更好的方式分析递归函数。无论何时您忘记了递归函数,只要回忆一下these示例即可。
https://stackoverflow.com/questions/18376504
复制相似问题