Функция поворота, использующая рекурсию в C, которая принимает массив и целое число в качестве входных данных - PullRequest
0 голосов
/ 03 июля 2019

При первой публикации, я прошу прощения, если мой вопрос не соответствует правилам, но любые отзывы о моем вопросе и публикации вопросов приветствуются:)!

Я работаю над проблемой, которая требует написания рекурсивной функции void с двумя параметрами: массивом и целым числом n, который поворачивает первые n целых чисел в массиве влево.

Таким образом, ввод будет выглядеть примерно так:

5 10 20 30 40 50

Выход:

50 40 30 20 10

Я написал функцию поворота с использованием рекурсии, и, похоже, она работает как положено.

#include <stdio.h>

void rotateLeft(int y[], int n){

   int temp;
   if (n > 1){
      temp = y[0];
      y[0] = y[1];
      y[1] = temp;
      rotateLeft(y + 1, n - 1);
   }
}

int main(void){

   int y[5];
   int n;
   int i = 0;

   //input number from user
   printf("Enter 'Count' number and 'elements' into array: ");
   scanf("%d", &n);
   for (i = 0; i < 5; i++){
      scanf("%d", &y[i]);
   }

   rotateLeft(y, n);

   for ( size_t i = 0; i < sizeof( y ) / sizeof( *y ); i++ ) printf( "%d ", y[i] );
    puts( "" );

   return 0;
}

Я использую Visual Code Studio и сталкиваюсь с двумя проблемами при попытке запустить этот код. Во-первых, он никогда не запрашивает мой ввод и просто выводит случайные числа в указанных местах массива, таких как: 3345345 345456 564565 56 4564

В другой раз код просто запускается и никогда не останавливается, и мне приходится принудительно останавливать его.

В этот момент я столкнулся со стеной, и я уверен, что проблема заключается в моей основной функции, но я ударился о стену в моей голове о том, куда идти. Я не программирую последние 5 лет, поэтому я очень не практикуюсь.

Любая помощь и руководство приветствуются!

Ответы [ 2 ]

0 голосов
/ 03 июля 2019
#include <stdio.h>
#include <stdlib.h>
//recursion 
//a b c d e
//round-1
//e b c d a
//round-2
//e d c b a
void Rec_ReverseAr(int y[], int n,int max_n){
   int temp;
   if (max_n > n*2){
      temp = y[max_n-n-1];
      y[max_n-n-1] = y[n];
      y[n] = temp;
      Rec_ReverseAr(y, n+1,max_n);
   }
}
//inplace
void Better_ReverseAr(int y[],int max_n){
    int Upper=max_n/2,i,temp;
    for (i = 0; i < Upper; i++){
        temp = y[max_n-i-1];
        y[max_n-i-1] = y[i];
        y[i] = temp;
    }
}


int main(){

    int *y;
    int n;
    int i = 0;

    //input number from user
    printf("Enter 'Count' number and 'elements' into array: ");
    scanf("%d", &n);
    if(n<1){//prevent nagtive int
        printf("Hey You Enter Wrong Number!\n");
        return 0;
    }
    y=(int*)malloc(sizeof(int)*n);//alloc amount n of int for y
    for (i = 0; i < n; i++){
        scanf("%d", &y[i]);
    }

    Rec_ReverseAr(y,0,n);
    //Better_ReverseAr(y,n);
    for (i = 0; i < n; i++ ){
        printf( "%d ", y[i] );
    }



    free(y);//release memory of y

    return 0;
}

Вот вы

your function
void rotateLeft(int y[], int n){

   int temp;
   if (n > 1){
      temp = y[0];
      y[0] = y[1];
      y[1] = temp;
      rotateLeft(y + 1, n - 1);
   }
}

0.a b c d e f
1.*b a* c d e f
2.b *c a* d e f
3.b c *d a* e f
...
is wrong
0 голосов
/ 03 июля 2019

Код в ответе работает нормально при компиляции с gcc (и ввод n меньше или равен 5, в противном случае метод rotateLeft выйдет за пределы массива).

Поскольку стандартный ввод с scanf, похоже, не работает, это может быть проблемой, связанной со сборкой программы (вероятно, это должна быть подсистема win32 или win64: консольное приложение, ссылка: описание / SUBSYSTEM в Microsoft ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...