说我有这样的事情:(预测输出)
void abc (char *s){
if(s[0]=='\0')
return;
abc(s+1);
abc(s+1);
printf(“%c “, s[0]);
}
解决问题并不困难,但是我花了太多时间做这件事而且我要重复这些问题2-3次因为我忘记了递归和变量值(特别是当有2-3个这样的递归时)语句)
当必须解决这些问题时,有什么好的方法可以使用吗?
答案 0 :(得分:1)
基本技术首先是以小输入开始。然后尝试一个更大的。然后尝试一个大于那个。对于递归函数,应该出现一个模式,让您可以预测下一个模型的外观,因为您知道前一个模型的样子。
所以,让我们从一个空字符串开始。简单,没有打印。
input: ""
output:
接下来是一个长度为1的字符串。几乎同样简单,两个递归调用都不执行任何操作(空字符串大小写),然后打印字符串的字符。
input: "z"
output: z
接下来是一个长度为2的字符串。每个递归调用最终打印第二个字符(长度为1的字符串),然后打印第一个字符。
input: "yz"
output: zzy
所以,让我们试着预测三种长度的字符串会发生什么。会发生什么是排除第一个字符的子字符串被处理两次,然后打印第一个字符。该子字符串是长度为2的字符串。所以:
input: "xyz"
output: zzyzzyx
因此,现在应该清楚如何在给定当前输出序列的情况下导出下一个输出序列。
答案 1 :(得分:0)
拿一堆适当大小的索引卡片。开始跟踪对递归函数的初始调用。当你接到另一个电话时,开始一张新的索引卡片,然后把它放在第一张卡片的前面或者在它后面(如果适用的话)。迟早你会(除非你正在追踪一个无限递归)跟踪一个没有进行递归调用的调用的执行,在这种情况下,将返回值复制回你来自的卡。
在你的牌上加入'去卡X'和'来自卡Y'可能是一个好主意。
在复杂的情况下,您可能会发现创建多个卡片来跟踪您的函数调用很有用,哦,为什么不能称之为调用堆栈。
答案 2 :(得分:0)
分析递归的最简单示例是Fibonacci and Factorial function。
这将帮助您以更好的方式分析递归函数。每当您忘记递归函数时,只需回忆these个例子。