C - 数组的递归累积和

时间:2015-03-04 02:41:20

标签: c arrays recursion

我的任务是创建一个带有数字数组的递归函数,并将其转换为所有数字累积和的数组,直到此为止:

1,2,3,4,5变为1,3,6,10,15

这就是我提出的:

#include <stdio.h>

int cumul(int tab[], int length, int ind) {

    if (ind > 0) {
        tab[ind] += tab[ind-1];
    }
    if (ind < length) {
        cumul(tab, length, ind+1);
    }
    return 0;
}

int main() {
    int ind;
    int tab[6] = {1, 2, 3, 4, 5, 6};
    int length = sizeof(tab)/sizeof(tab[0]);

    for (ind = 0; ind < length; ind++) {
        printf("%d ", tab[ind]);
    }
    printf("\n");

    cumul(tab, length, 0);

    for (ind = 0; ind < length; ind++) {
    printf("%d ", tab[ind]);
    }
    printf("\n");
    return 0;
}

在大多数情况下它运作良好,但我遇到了奇怪的特定数组:

例如,它不适用于tab [6] = {1,2,3,4,5,6},这里是输出:

1 2 3 4 5 6 
1 3 6 10 15 21 27 7 4196016 0 -1076574208 32528 -1609083416 32767 -1609083416 32767 0 1 4195802 0 0 0 -1815242402 30550560 4195424 0 -1609083424

我不知道为什么会疯狂。它适用于我尝试的任何tab [5]和tab [7]数组,但是我尝试的每个tab [6]数组都失败了。

1 个答案:

答案 0 :(得分:0)

ind到达length-1时出现问题。例如,如果length为6,ind为5,则递归调用为

cumul(tab, 6, 6);  // length=6 ind+1=6

在下一级递归时,在if ( ind > 0 )之后,代码将执行此操作

tab[6] += tab[5];  // ind=6 ind-1=5 

这会导致未定义的行为,因为你写的是超出数组的末尾。

您可以检查第一个if语句的上限,例如

if ( ind > 0 && ind < length )

但最好通过将第二个if语句更改为

来避免递归调用
if ( ind < length - 1 )

任何一项更改都可以避免您访问tab[length]的情况。