你能帮我避免使用递归,因为它会导致stackoverflow

时间:2014-01-14 13:14:50

标签: algorithm recursion

我的函数有问题,使用递归。解释它本身有点困难和冗长,因此我将尝试编写基本要素并给出一些伪代码。希望这是可以理解的。

假设我有一个数字数组 - 正数应该添加到给定数字,而如果有负数,它们的绝对值告诉数组从哪个位置开始添加下一个可能的数字。

Example:

The given number is 5.

array = [1, 2, -3, 5, 7, 8, 9]
         0  1   2  3  4  5  6   <------- positions

所以我们有:5(给出)+ 1 + 2 +(数组[来自第3个元素] = 5 + 7 + 8 + 9)= 5 + 3 + 29 = 37

我有(假设函数的主体有权访问并更改名为number的变量):

number = 5;
sum(array)
{
    for each element from first to last in the array {
        //here i have some other actions, saving some states

        if (element < 0) {
            return sum(array[abs(element) to end])
        }
        number += element
    }
}

您能否告诉我一些如何删除递归的想法或指示?

PS:抱歉,如果问题太笼统或不可理解,请原谅我,如果是这样,我会尽快将其删除。

4 个答案:

答案 0 :(得分:3)

难道你不能只使用简单的循环吗?

for (sum=i=0;i<array_length;) {
  if (array[i]<0) i=-array[i];
  else sum += array[i++];
}

或者我错过了什么?

答案 1 :(得分:2)

我认为这可以解决问题吗?

private long Sum(int[] array)
{
    long result = 0;
    int index = 0;
    while (index < array.Length)
    {
        int val = array[index];
        if (val < 0)
        {
            index = Math.Abs(val);
        }
        else
        {
            result += array[index++];
        }

    }
    return result;
}

答案 2 :(得分:1)

i=0
a = [1,2,-3,5,7,8,9]
sum = 0
while (i < a.count)
{
  if a[i] >= 0
    sum += a[i]
    i++
  else
    i = abs(a[i])
} 

答案 3 :(得分:1)

也许是这样的?

sum(array, s) // s is the initial sum value
{
    for i = 0 to last array index
    {
        if (array[i] < 0)
        {
            for j = -array[i] to last array index
            {
                s += array[j]
            }
            return s
        }
        s += array[i]
    }
}