Member 13476370 Ответов: 1

Рекурсивная функция для проверки восходяще отсортированного массива


предполагается, что программа представляет собой рекурсивную функцию для проверки восходяще отсортированного массива
вот моя пробная версия ,но программа работает плохо, она должна печатать 1, вместо этого она печатает -1!

Что я уже пробовал:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int iss(int list[],int size)
{
    if(*list > *(list+1)) return -1;
    if(list==list+size-1) return 1;
    return iss(list+1,size);
}

int main()
{ int arr[5]={1,1,5,6,7};
printf("%d",iss(arr,5));
return 0;
}

PIEBALDconsult

Для этой задачи; повторяйте, не рекурсируйте.
И если вы знаете, что он отсортирован, попробуйте двоичный поиск.

1 Ответов

Рейтинг:
11

CPallini

Следующее условие остановки

Цитата:
f(list==list+size-1) return 1;
ущербен: если, во-первых iss вызов, (size > 1) тогда она никогда не будет удовлетворена.
Попробуйте вместо этого
int iss(int list[],int size)
{
    if ( size == 0 ) return 1;
    if(*list > *(list+1)) return -1;
    return iss(list+1,size-1);
}


Member 13476370

Я понимаю ваше решение, и оно, безусловно, лучше моего ... но я все еще не знаю, почему не могу быть удовлетворен if(list==list+size-1)? ... каждый раз, когда я меняю указатель арифметически на следующий элемент, последний указатель указывает на последний элемент массива ... почему это не должно сработать?

CPallini

Думать о:
список == список + размер - 1
в левой и правой частях выражения значение список всегда одно и то же, следовательно, все выражение эквивалентно
0 == Размер - 1
с размер не меняется, если по первому зову (размер > 1) тогда результат выражения никогда не может быть истинный.