最长的索引 - 递归

时间:2009-12-14 10:03:43

标签: recursion

我需要为此作业编写代码,研究的主题是递归方法:

示例:考虑arr = {0,5,1,1,2}。指数0,2和3位置很好:

  • 由于P0 = 0,因此索引0处于良好位置。
  • 索引1不适合放置,因为P1 = 5> 1。由于所有元素都是正数,因此无法找到从索引1开始的可以求和为1的序列。
  • 由于P2 + P3 = 2,因此索引2处于良好位置。
  • 指数3位置合理,因为P3 + P4 = 3。
  • 索引4位置不好:我们找不到从索引开始的序列,可以求和为4 - 这是因为P4是数组中的最后一个元素,而且只有2。

我们将良好放置的索引的'良好放置的长度'定义为j-i + 1 - 求和时的序列长度表示索引放置得很好。索引可以放置多个元素序列。在这种情况下,“良好放置的长度”是将索引定义为“放置良好”的各种序列的最大长度。

示例:查看上一个示例:

  • 索引0良好放置的长度为1(i = 0,j = 0,j-i + 1 = 1)。
  • 索引2放置良好的长度为2(i = 2,j = 3,j-i + 1 = 2)。
  • 索引3放置良好的长度为2(i = 3,j = 4,j-i + 1 = 2)。
  • 对于指数1和4,没有定义良好放置的长度,因为指数没有很好地放置。
  • 考虑arr = {0,5,1,1,2,0} - 索引3良好放置的长度现在是3(i = 3,j = 5,j-i + 1 = 3)。定义索引3的另一个序列与之前一样是(i = 3,j = 4,j-i + 1 = 2),但是我们已经将良好放置的长度定义为索引的最大值。 / LI>

'最大放置长度'是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);
}

显然,它不起作用:) 有人可以试着帮忙吗?

2 个答案:

答案 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 ()测试失败时,您需要考虑递归的持续方式。