2016-01-12 3 views
0

Учитывая массив 2 18 3 15 3 9 7 4 Я хочу проверить рекурсивно с помощью одной функции, если массив растет по четным индексам и вниз по нечетным индексам , (Кстати, этот массив отсортирован, и мой код возвращает ложь на что)Указанный массив, по четным индексам, убедитесь, что он растет вверх, по нечетным индексам вниз

То, что я сделал:

Я создал Funtion, который проверяет, если массив будет на четном индексов и работает. Я создал еще одну функцию, которая проверяет, идет ли массив на нечетные индексы, и он не работает (возвращает нуль вместо одного).

То, что я хочу добиться:

[Решено] 1. Я хотел бы получить справку о получении второй функции для работы, это действительно странно, что он не работает, потому что он похож к первой функции.

Об этой функции я изменил эту строку if (num <= 0) на это, если (num <= 1). и теперь он сортируется.

  1. Я хочу сделать только одну функцию, называемую, например, SortedUpDown, который будет проверять одновременно рекурсивно, если массив растет нечетно и вниз по четным индексам.

А вот мой полный код:

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

int SortedDown(int *arr, int num); 
int SortedUp(int *arr, int num); 

int main(void) 
{ 
    int sizeOfArr = 0, i = 0, *arr, num = 0, checkIfSortedDown = -1, checkIfSortedUp = -1; 
    printf("Enter the size of the array : \n"); 
    scanf("%d", &sizeOfArr); 
    printf("Enter %d numbers to the array \n: ", sizeOfArr); 
    arr = (int *)malloc(sizeOfArr * sizeof(int)); 
    for (i = 0; i < sizeOfArr; i++) 
    { 
     scanf("%d", arr + i); 
     printf("%d ", arr[i]); 
    } 
    puts(""); 
    checkIfSortedDown = SortedDown(arr, sizeOfArr); 
    checkIfSortedUp = SortedUp(arr, sizeOfArr); 
    if (checkIfSortedDown && checkIfSortedUp) 
     puts("Sorted"); 
    else 
     puts("Not Sorted"); 
    free(arr); 
    getch(); 

    return 0; 
} 

int SortedDown(int *arr, int num) { 
    --num;//size to last index 
    if (num % 2 != 0) //if index is not even 
     --num; 
    if (num <= 0) 
     return 1;//Sorted 
    else if (arr[num - 2] > arr[num]) 
     return 0;//Not sorted 
    else 
     return SortedDown(arr, num - 2 + 1);//+1 : last index to size 
} 

int SortedUp(int *arr, int num) { 
    --num;//size to last index 
    if (num % 2 == 0) 
     --num; 
    if (num <= 0) 
     return 1;//Sorted 
    else if (arr[num - 2] < arr[num]) 
     return 0;//Not sorted 
    else 
     return SortedUp(arr, num - 2 + 1);//+1 : last index to size 
} 
+0

Зачем вам нужна рекурсия для этого? –

+0

Вы считаете начальный индекс как 1 или 0? – roottraveller

+0

Решение моей первой проблемы: В этой функции я изменил эту строку 'if (num <= 0)' на это, если '(num <= 1)'. и теперь он сортируется. –

ответ

1

Вот мое решение второй части вопроса:

int SortedUpDown(int * arr, int num) { 
    if (num < 3) { 
    return 1; // it's always sorted 
    } 

    if (arr[0] > arr[2]) { 
    return 0; 
    } 

    if (num > 3 && arr[1] < arr[3]) { 
    return 0; 
    } 
    return SortedUpDown(arr + 2, num - 2); 
} 
+1

Саша, это замечательно! Большое спасибо! –

+0

Вам не кажется, что «num> 3» бесполезно? потому что я не вижу, как это способствует. –

+0

О, на самом деле я знаю, как это способствует. если у нас есть num = 3., то он перейдет к границе массива, если мы проверим arr [3]. –

Смежные вопросы