我的任务是创建一个带有数字数组的递归函数,并将其转换为所有数字累积和的数组,直到此为止:
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]数组都失败了。
答案 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]
的情况。