如何在C中递归求逆整数向量(array)?

时间:2019-02-23 17:28:43

标签: c

这是我的无效代码:

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

它可以很好地编译,但是在执行时会卡住。

2 个答案:

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