这是我的无效代码:
#define TAM 5
int vec[TAM];
int revvec[TAM] = {0};
void invertir(int vec[], int revvec[], int i)
{
if ((TAM - 1 - i) == 0) {
revvec[i] = vec[0];
}
else {
revvec[i] = vec[TAM - 1 - i];
invertir(vec, revvec, i++);
}
}
它可以很好地编译,但是在执行时会卡住。
答案 0 :(得分:1)
您的代码有问题:
invertir(vec, revvec, i++);
必须
invertir(vec, revvec, ++i); /* or i+1 */
否则,您总是给递归调用赋予索引0,最终使堆栈爆炸
更正之后,您的代码就可以了:
#include <stdio.h>
#define TAM 5
int vec[TAM]={ 1,2,3,4,5};
int revvec[TAM]={0};
void invertir(int vec[], int revvec[],int i){
if (((TAM-1)-i)==0) {
revvec[i]=vec[0];
}
else {
revvec[i]=vec[(TAM-1)-i];
invertir(vec, revvec,++i); /* or i+1 */
}
}
int main()
{
invertir(vec,revvec, 0);
for (int i = 0; i != TAM; ++i)
printf("%d ", revvec[i]);
putchar('\n');
return 0;
}
编译和执行:
pi@raspberrypi:/tmp/d $ gcc -g -pedantic -Wextra x.c
pi@raspberrypi:/tmp/d $ ./a.out
5 4 3 2 1
您还可以简化为:
void invertir(int vec[], int revvec[],int i){
revvec[i]=vec[(TAM-1)-i];
if ((TAM-1) != i) {
invertir(vec, revvec, i + 1);
}
}
答案 1 :(得分:0)
要使函数不与数组声明中的TAM
绑定,而是保持其通用性,请将数组长度作为参数传递:
#include <stddef.h> // size_t
void reverse_impl(int const *src, int *dst, size_t length, size_t pos)
{
if (pos == length)
return;
dst[pos] = src[length - pos - 1];
reverse_impl(src, dst, length, pos + 1);
}
void reverse(int const *src, int *dst, size_t length)
{
reverse_impl(src, dst, length, 0);
}