我需要为此作业编写代码,研究的主题是递归方法:
示例:考虑arr = {0,5,1,1,2}。指数0,2和3位置很好:
我们将良好放置的索引的'良好放置的长度'定义为j-i + 1 - 求和时的序列长度表示索引放置得很好。索引可以放置多个元素序列。在这种情况下,“良好放置的长度”是将索引定义为“放置良好”的各种序列的最大长度。
示例:查看上一个示例:
'最大放置长度'是arr中所有放置良好的指数的井位长度之间的最大值。 如果数组中的索引没有放置好,则最大放置长度被认为是零。
该函数应返回最大放置长度。
示例:对于前面的示例,longestIndex的返回值应为2,因为这是数组中任何放置良好的索引的最大放置长度。
限制:不允许更改阵列;你不能使用超过1个额外的(辅助)函数,可以从longestIndex中获得。不允许迭代。
这是我写的代码:
int longestIndexHelper(int arr[], int length, int old)
{
if(length==0)
return 0;
if((arr[length]+arr[length-1]==length-1)||
(arr[0]==0)&&(old!=0)&&(old-length==1))
return (longestIndexHelper(arr, --length, length)+1);
}
int longestIndex(int arr[], int length)
{
return longestIndexHelper(arr, length, length);
}
显然,它不起作用:) 有人可以试着帮忙吗?
答案 0 :(得分:0)
不允许迭代。
这是一个完全人为的限制,当在这种情况下它显然是一个低级解决方案时,它会推动我们进行递归。大学教授什么时候开始寻找实际上想要这些作业的递归解决方案(例如,树行走)的东西?
我个人通过编写迭代版本并将其转换为尾部调用递归版本来完成此操作。只是为了满足这个任意要求。并将迭代版本留在注释中只是因为。
无论如何,你的工作不起作用的原因是它只检查长度为2的位置匹配。
编辑:这是我的递归解决方案的简要概述:int longestIndex(int arr[], int length) {
if(length == 0) return 0;
int thisLongestIndex = longestIndexHelper(
/*whatever parameters you need in order to call it on the first element
in the array*/
);
return max(thisLongestIndex, longestIndex(arr+1,length-1));
}
其中longestIndexHelper将计算出数组中第一个元素的最长匹配。
答案 1 :(得分:0)
我不会调试你的整个函数,但一个明显的潜在缺陷是在某些情况下你的帮助函数不会返回任何值。
当if ()
测试失败时,您需要考虑递归的持续方式。