在c中查找数组和的递归函数
我必须找到一个递归函数,它通过反复将数组划分为几乎相等的两部分来求数组的和 我的方法应该是什么?我该怎么做在c中查找数组和的递归函数,c,arrays,C,Arrays,我必须找到一个递归函数,它通过反复将数组划分为几乎相等的两部分来求数组的和 我的方法应该是什么?我该怎么做 我不需要密码!只是一个解决这个问题的提示或方向 这是一种分而治之的方法。更多信息请参见这是一种分而治之的方法。请参阅更多内容,这相当简单。一个数据集上的每个递归算法都应该根据一个更简单的数据集上的相同算法a来定义,并带有终止条件 在这种情况下,终止条件是一个大小为1的数据集,其中您只返回值,否则每个递归级别只是在两半上执行相同的任务,然后将两个结果相加 这类似于以下伪代码: def sum
我不需要密码!只是一个解决这个问题的提示或方向 这是一种分而治之的方法。更多信息请参见这是一种分而治之的方法。请参阅更多内容,这相当简单。一个数据集上的每个递归算法都应该根据一个更简单的数据集上的相同算法a来定义,并带有终止条件 在这种情况下,终止条件是一个大小为1的数据集,其中您只返回值,否则每个递归级别只是在两半上执行相同的任务,然后将两个结果相加 这类似于以下伪代码:
def sumof (array, start, end):
if start == end:
return array[start]
midpoint = (start + end) / 2
return sumof (array, start, midpoint) +
sumof (array, midpoint + 1, end )
现在,您所要做的就是将其转换为您选择的语言,并在边缘情况下调试任何潜在的问题
让我们看看这是如何在零索引七元素数组中对数字10到16起作用的。如果你在脑子里运行这个算法,或者在纸上运行,如果你还没有变成像我一样的机器,你会得到这样的结果:
Level 0, call sumof (array, 0, 6):
Level 1, call sumof (array, 0, 3)
+---Level 2, call sumof (array, 0, 1)
| +---Level 3, call sumof (array, 0, 0), returns 10
| |---Level 3, call sumof (array, 1, 1), returns 11
| Add together to get 21
| Level 2, call sumof (array, 2, 3)
| +---Level 3, call sumof (array, 2, 2), returns 12
| |---Level 3, call sumof (array, 3, 3), returns 13
|---Add together to get 25
+---Add together to get 46
| Level 1, call sumof (array, 4, 6)
| Level 2, call sumof (array, 4, 5)
| +---Level 3, call sumof (array, 4, 4), returns 14
| |---Level 3, call sumof (array, 5, 5), returns 15
| +---Add together to get 29
| |---Level 2, call sumof (array, 6, 6), returns 16
|---Add together to get 45
|
Add together to get 91
a情况并非总是如此,有时实际的算法也会发生变化,但很少看到这种情况。这相当容易。一个数据集上的每个递归算法都应该根据一个更简单的数据集上的相同算法a来定义,并带有终止条件 在这种情况下,终止条件是一个大小为1的数据集,其中您只返回值,否则每个递归级别只是在两半上执行相同的任务,然后将两个结果相加 这类似于以下伪代码:
def sumof (array, start, end):
if start == end:
return array[start]
midpoint = (start + end) / 2
return sumof (array, start, midpoint) +
sumof (array, midpoint + 1, end )
现在,您所要做的就是将其转换为您选择的语言,并在边缘情况下调试任何潜在的问题
让我们看看这是如何在零索引七元素数组中对数字10到16起作用的。如果你在脑子里运行这个算法,或者在纸上运行,如果你还没有变成像我一样的机器,你会得到这样的结果:
Level 0, call sumof (array, 0, 6):
Level 1, call sumof (array, 0, 3)
+---Level 2, call sumof (array, 0, 1)
| +---Level 3, call sumof (array, 0, 0), returns 10
| |---Level 3, call sumof (array, 1, 1), returns 11
| Add together to get 21
| Level 2, call sumof (array, 2, 3)
| +---Level 3, call sumof (array, 2, 2), returns 12
| |---Level 3, call sumof (array, 3, 3), returns 13
|---Add together to get 25
+---Add together to get 46
| Level 1, call sumof (array, 4, 6)
| Level 2, call sumof (array, 4, 5)
| +---Level 3, call sumof (array, 4, 4), returns 14
| |---Level 3, call sumof (array, 5, 5), returns 15
| +---Add together to get 29
| |---Level 2, call sumof (array, 6, 6), returns 16
|---Add together to get 45
|
Add together to get 91
a情况并非总是如此,有时实际的算法也会发生变化,但很难看出这一点。递归函数与分治技术高度相关。 你应该关注的两个方面是 如何将大问题分解为小的容易解决的问题; 如何将所有小问题的解决方案合并为原始大问题的解决方案。
当然,您可以将阵列划分为两个大小相似的问题。下一步是如何合并结果。让我们看看您的努力:p.递归函数与分治技术高度相关。 你应该关注的两个方面是 如何将大问题分解为小的容易解决的问题; 如何将所有小问题的解决方案合并为原始大问题的解决方案。
当然,您可以将阵列划分为两个大小相似的问题。下一步是如何合并结果。让我们看看您的努力:p.这将是一个分而治之的算法: 创建将采用以下参数的函数: 大堆 起始索引 结束索引 当开始索引等于结束索引时,函数应返回位于开始或结束索引位置的数组中的值 否则,它应返回具有以下参数的同一函数的两个调用之和: 数组,开始索引,开始+结束索引/2 数组,开始+结束索引/2+1,结束索引
这将是一个分而治之的算法: 创建将采用以下参数的函数: 大堆 起始索引 结束索引 当开始索引等于结束索引时,函数应返回位于开始或结束索引位置的数组中的值 否则,它应返回具有以下参数的同一函数的两个调用之和: 数组,开始索引,开始+结束索引/2 数组,开始+结束索引/2+1,结束索引
有一种排序算法,它使用类似的原则进行分区排序http://www.algolist.net/Algorithms/Sorting/Quicksort有一种排序算法,它使用类似的原则进行分区排序http://www.algolist.net/Algorithms/Sorting/Quicksort在C中调用以下函数,如果原始数组的大小为N,则最初将函数调用为
sum=rec_sum(0,N-1);
功能如下所示
int rec_sum(int array[],start,end)
{
if(start==end)
{
return array[start];
}
else
{
return rec_sum(array,start,(start+end)/2) + rec_sum(array,(start+end)/2+1,end);
}
}
在C中调用以下函数,如果原始数组的大小为N,则最初将函数调用为
sum=rec_sum(0,N-1);
功能如下所示
int rec_sum(int array[],start,end)
{
if(start==end)
{
return array[start];
}
else
{
return rec_sum(array,start,(start+end)/2) + rec_sum(array,(start+end)/2+1,end);
}
}
我们将为你解决你的家庭作业。这是一种奇怪的家庭作业:要求数组上的递归和,它肯定比简单的迭代慢,而不是要求在排序树或数组中找到一个值,递归会发光。。。换句话说,为什么要求在s上使用递归
一些不应该使用的东西,而不是应该使用的东西@OlivierDulac,如果目的只是学习递归,那么可能任何练习都和其他练习一样好。我希望在某种程度上,他们可以根据你的评论来考虑递归。我们将为你解决你的家庭作业。这是一种奇怪的家庭作业:要求一个数组上的递归和,它肯定比简单的迭代慢,并且不要求在排序树或数组中找到值。递归将在哪里发光。。。换句话说,为什么要求在不应该使用递归的地方使用递归,而不是在应该使用递归的地方使用递归@OlivierDulac,如果目的只是学习递归,那么可能任何练习都和其他练习一样好。我希望在某种程度上,他们可以根据你的评论来考虑何时递归。你有什么工具来画这棵树吗?“GrijeshChauhan,不,额头上的汗。”我是手工做的。虽然我不怀疑你可以在转换成真实语言后修改伪代码来生成这样的输出。是的。顺便说一句,如果你需要绘制复杂的图表,你可以使用我喜欢的acsii艺术。Emacs有艺术家模式和图片模式,可以绘制类似的东西。不过干得好@格里杰什乔汉,很好的发现。事实上,我可能会在本地实现类似的功能,以防该网站消失,但我现在已经将其添加到书签中。你有任何工具来绘制这棵树吗?@GrijeshChauhan,没有,恐怕是汗流浃背。我是手工做的。虽然我不怀疑你可以在转换成真实语言后修改伪代码来生成这样的输出。是的。顺便说一句,如果你需要绘制复杂的图表,你可以使用我喜欢的acsii艺术。Emacs有艺术家模式和图片模式,可以绘制类似的东西。不过干得好@格里杰什乔汉,很好的发现。事实上,我可能会在本地实现类似的东西,以防该网站消失,但我现在已经将其标记为书签。