一个递归函数,用于查找c中数组的总和

时间:2013-06-06 13:03:59

标签: c arrays

我必须找到一个递归函数,通过反复将它分成2个几乎相等的部分来找到数组的总和?

我的方法应该是什么?我该怎么做?

我不要求代码!只是提示或方向来解决这个问题!

6 个答案:

答案 0 :(得分:6)

这很容易。数据集上的每个递归算法都应该在更简单的数据集上使用相同的算法(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)这不是总是的情况,有时候实际的算法会发生变化,但是很少见到它。

答案 1 :(得分:2)

这是一种“分而治之”的方法。查看更多here

答案 2 :(得分:1)

这将是一个分而治之的算法:

  1. 创建一个将使用以下参数的函数:
    • 阵列
    • 开始索引
    • 结束指数
  2. 当起始索引等于结束索引时,该函数应该从起始(或结束)索引位置的数组返回值
  3. 否则它应该使用以下参数返回相同函数的两个调用的总和:
    • 数组,开始索引,(开始+结束)索引/ 2
    • 数组,(开始+结束)索引/ 2 + 1,结束索引

答案 3 :(得分:0)

递归函数与divide-and-conquer技术高度相关。 你应该关注的两个方面是

  1. 如何将大问题分解为较小的易解决问题;
  2. 如何将解决方案与所有小问题合并,作为原始大问题的解决方案。
  3. 当然,你可以将数组分成两个类似大小的问题。下一步是如何合并结果。让我们看看你的努力:p。

答案 4 :(得分:0)

有一种排序算法,它使用类似的原则进行分区以排序http://www.algolist.net/Algorithms/Sorting/Quicksort

答案 5 :(得分:0)

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);
   }
}