Возвращаемое значение с помощью операторов c - PullRequest
0 голосов
/ 19 апреля 2020

Может кто-нибудь объяснить мне, как работает этот возврат, когда есть операторы logi c? Также объясните, когда эта функция будет возвращать себя и элементы массива?

#include<stdio.h>
int consecutive_3(int x, int y, int z, int a[], int n)
{
    if(n<3)
       return 0;
    return ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) || consecutive_3(x, y, z, a, n-1);
}

Ответы [ 3 ]

1 голос
/ 19 апреля 2020

как работает return в этом случае, когда есть оператор logi c

В return нет ничего особенного - он просто возвращает значение выражения, как только оно имеет

Итак, в вашем случае:

return ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) || consecutive_3(x, y, z, a, n-1);

- это то же самое, что

int temp = ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) || consecutive_3(x, y, z, a, n-1);
return temp;

, когда эта функция будет возвращать себя и когда элементы массива

Он никогда этого не делает. Он всегда возвращает целое число.

Идея состоит в том, что функция просматривает массив, чтобы найти 3 последовательных элемента со значениями x, y и z.

Если найдено, он возвращает 1.

Если не найден, он вызывает сам себя, но смотрит на новую точку в массиве, то есть на следующий более низкий индекс массива. Это продолжается до тех пор, пока не будет произведен поиск по всему массиву.

Если он все еще не найден, он возвращает 0. Для этого if (n < 3) return 0;.

Итак, предположим, массив:

int a[] = {1, 2, 3, 4, 5, 6};

и вызов функции

consecutive_3(1, 2, 3, a, 6);

Тогда у вас вот так

 Is 1, 2, 3 equal 4, 5, 6 No, so call again
 Is 1, 2, 3 equal 3, 4, 5 No, so call again
 Is 1, 2, 3 equal 2, 3, 4 No, so call again
 Is 1, 2, 3 equal 1, 2, 3 Yes, return 1

Если бы вызов был

consecutive_3(10, 2, 3, a, 6);

, это было бы

 Is 10, 2, 3 equal 4, 5, 6 No, so call again
 Is 10, 2, 3 equal 3, 4, 5 No, so call again
 Is 10, 2, 3 equal 2, 3, 4 No, so call again
 Is 10, 2, 3 equal 1, 2, 3 No, so call again
 No more unchecked elements so return 0
1 голос
/ 19 апреля 2020

должно быть таким же

int consecutive_3(int x, int y, int z, int a[], int n)
{
    if (n < 3)
       return 0;

    if ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z))
       return 1;

    return consecutive_3(x, y, z, a, n - 1);
}

уведомление: c оценивает логические выражения слева направо и && имеет более высокий приоритет (оценивается первым), чем ||.

0 голосов
/ 19 апреля 2020

Эта функция проверяет наличие 3 последовательных чисел xyz в массиве a [] от индекса 0 до n-1. Возвращает 0 (не найдено) или 1 (найдено).

Сначала выполняется проверка вне допустимого диапазона:

if (n < 3)
   return 0;  // there are less than 3, can not match

Затем проверяются последние три числа:

return ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) (|| ...)

, если все три совпадают, возвращается 1 как значение. Но если нет, он возвращает правую часть выражения после || (логическое или).

Эта часть снова вызывает ту же функцию, но сокращает массив, поэтому она снова проверяет последние 3 сокращенного массива.

Ключ к пониманию заключается в том, что return выбирает между двумя совместимыми альтернативами (оба являются логическим значением); первый - это предполагаемый (но частичный) тест, второй - это предполагаемый тест, выполняемый для разных данных, только если первый не пройден.

Это умная система, но не очень быстрая из-за накладных расходов на вызов снова и снова, подчеркивая стек и передавая аргументы; один для l oop был бы таким же простым и намного быстрее.

...