Рекурсия и функции - PullRequest
       2

Рекурсия и функции

0 голосов
/ 27 апреля 2018

Спасибо за помощь всем. Я буду продолжать смотреть на это, чтобы я мог лучше понять! Я все еще борюсь с рекурсией, но я буду изучать ее больше. Еще раз спасибо за все ваше время и усилия за попытку помочь мне - /

       int countEven(int arr[i]){
       //I'm not sure what to do here... how to fix it...
       int evens = 0;
       if(arr[i] <= 0) return 0; //base case

       while(arr[i] > 0){
       int digit = arr[i]%10; //get the last digit
       if(digit%2 == 0){
          evens = evens+1;
        }
        arr[i] = arr[i]/10;
        }
        cout << evens;
         }
            }
        }
         int main(){
             cout << "Part A:\n";
             int arr[3] = { 5050155, 5, 707070 };
             for (int i = 0; i < 3; i++){
             cout << "countEven(" << arr[i] << ") = " << countEven(arr[i]) << endl;
             cout << "removeEven(" << arr[i] << ") = " << removeEven(arr[i]) << endl;
             cout << "hasEven(" << arr[i] << ") = ";


 if (hasEven(arr[i])) cout << "Yes" << endl;
         else cout << "No" << endl;
         printStarDigit(arr[i]);
         cout << endl << endl;
         }
         cout << "Part B:\n";
         int a[4] = { 7, 2, 8, 3 };
         int b[5] = { 3, 4, 5, 6, 7 };
         cout << "The range of array a is " << range(a, 4) << endl;
         cout << "The range of array b is " << range(b, 5) << endl;
         reverse(a, 4);
         reverse(b, 5);
         cout << "Array a reversed: ";
         for (int i = 0; i < 4; ++i)
         cout << a[i] << " ";
         cout << endl;
         cout << "Array b reversed: ";
         for (int i = 0; i < 5; ++i)
         cout << b[i] << " ";
         cout << endl;
         return 0;
        }

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

См. Эти фрагменты кода.

int countEven(int n, bool first_time = true){
    static int total ;
    int num =n;

    if (first_time)
    {
        total = 0;
    }

    if (num <= 9) {
        return num % 2 == 0 ? 1 : 0;
    }

    int temp = num - (num / 10) * 10;
    num = num / 10;
    total += temp % 2 == 0 ? 1 : 0;
    countEven(num,false);

    return total;
}

int removeEven(int n){
    int result = 0;
    /*TODO*/
    return result;
}

bool hasEven(int n){
    return countEven(n);
}

void printStarDigit(int* arr){
    /*TODO*/
}

int range(int* arr, int n){
    int result = *arr;
    for (int i = 0; i < n; i++) {
        if (result < *(arr + i))  result = *(arr + i);
    }
    return result;
}

void reverse(int* arr, int n){
    int* temp = new int[n];
    for (int i = 0; i < n; i++) {
        *(temp + i) = *(arr + i);
    }

    for (int i = 0; i < n; i++) {
        *(arr + i) = *(temp + n - 1 - i);
    }

    delete[] temp;
}

Основная реализация:

int main() {
    cout << "Part A:\n";
    int arr[3] = { 5050155, 5, 707070 };
    for (int i = 0; i < 3; i++) {
        cout << "countEven(" << arr[i] << ") = " << countEven(arr[i]) << endl;
        cout << "removeEven(" << arr[i] << ") = " << removeEven(arr[i]) << endl;
        cout << "hasEven(" << arr[i] << ") = ";


        if (hasEven(arr[i])) cout << "Yes" << endl;
        else cout << "No" << endl;
        printStarDigit(arr + i);
        cout << endl << endl;
    }

    cout << "Part B:\n";
    int a[4] = { 7, 2, 8, 3 };
    int b[5] = { 3, 4, 5, 6, 7 };
    cout << "The range of array a is " << range(a, 4) << endl;
    cout << "The range of array b is " << range(b, 5) << endl;
    reverse(a, 4);
    reverse(b, 5);
    cout << "Array a reversed: ";
    for (int i = 0; i < 4; ++i)
        cout << a[i] << " ";
    cout << endl;
    cout << "Array b reversed: ";
    for (int i = 0; i < 5; ++i)
        cout << b[i] << " ";
    cout << endl;
    return 0;
}

Выход:

enter image description here

0 голосов
/ 27 апреля 2018
int countEven(int arr[i]){

Параметры должны иметь простые имена и не должны совпадать с выражениями, передаваемыми в. arr[i] не является допустимым именем. Простое имя для использования здесь: n.

//I'm not sure what to do here... how to fix it...
int evens = 0;
if(arr[i] <= 0) return 0; //base case

Этот базовый случай неверен по двум причинам. Во-первых, вы рассматриваете все отрицательные целые числа как базовый случай, но -202020 имеет шесть четных цифр. Во-вторых, вы возвращаете неправильное значение: 0 имеет одну четную цифру, но вы возвращаете ноль.

Возможный базовый вариант может быть n > -10 && n < 10 (однозначное число). Я дам вам понять выражение, которое нужно вернуть для этого базового случая.

while(arr[i] > 0){

Если ваша задача - написать рекурсивную функцию, то вам не следует использовать цикл здесь. Вместо этого см. Ниже.

int digit = arr[i]%10; //get the last digit

...

arr[i] = arr[i]/10;

Это правильный способ получения последней цифры и всего, кроме последней цифры.

if(digit%2 == 0)

Это правильный способ определения четности последней цифры.

Теперь вам нужно объединить то, что у вас есть, заметив, что количество четных цифр равно «1, если последняя цифра четная, иначе 0», плюс количество четных не последних цифр. Цель этого упражнения - заставить вас записать «количество даже не последних цифр» как countEven(n / 10).

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