преобразовать итерационную функцию в рекурсивную функцию

0

У меня проблема с итеративной функцией и рекурсивной функцией. У меня есть итеративная функция, и я должен преобразовать ее в рекурсивную. не могли бы вы дать мне несколько советов по моему коду?

код должен определить, соответствует ли массив точек данных вогнутой функции с помощью рекурсии.

Вот код итеративной версии:

bool isConcave(double a[], int n)
{
int slope = 1;
bool concave = true;

for (int i = 1; i < n && concave; i++)
{
    double delta = a[i] - a[i-1];

    if (slope > 0)
    {
        if (delta < 0)
            slope = -1;
    }
    else if (delta > 0)  
        concave = false; // slope == -1 and delta > 0
}
return concave;
}

И вот код моей рекурсивной версии, который не может работать:

bool isConcave_r(double a[], int n, int& slope)  
{
//Implement this function using recursion
double delta = a[n] - a[n-1];
bool concave = true;

if (n == 0)
    return false;
if (slope > 0)
{
    if (delta < 0)
    {
        slope = -1;
    }
    else
        concave = true;
}else
    return 0;

//dummy return statement
return isConcave_r(a, n, slope);

}
Теги:
recursion
iteration

2 ответа

0

Не нужен лучший/самый чистый способ, но вы можете заменить любой цикл

for (int i = 0; i != N; ++i) {
    body(i, localVars);
}

от

void body_rec(int N, int i, LocalVars& localVars)
{
    if (i == N) return;
    body(i, localvars);
    body_rec(N, i + 1, localVars);
}

или

int body_rec(int N, int i, LocalVars& localVars)
{
    if (i == N) return localVars.res; // or any correct value
    body(i, localvars);
    if (localVars.end) { // break the "loop", and so stop the recursion.
        return localVars.res; // or any correct value
    }
    return body_rec(N, i + 1, localVars);
}

Таким образом, в вашем случае вы забываете пройти по slope в рекурсию.

[редактировать]

Полное решение:

bool isConcave_r(int N, int i, double a[], int slope)
{
    if (i >= N) return true;

    const double delta = a[i] - a[i-1];

    if (slope > 0) {
        if (delta < 0) {
            slope = -1;
        }
    }
    else if (delta > 0) {
        return false;
    }
    return isConcave_r(N, i + 1, a, slope);
}

bool isConcave(double a[], int n)
{
    int i = 1;
    int slope = 1;
    return isConcave_r(n, i, a, slope);
}

Также обратите внимание, что имя кажется "неправильным", вы не проверяете, является ли "кривая" вогнутой, случай, когда delta == 0 должен быть конкретным, я думаю...

  • 0
    Могу я задать вопрос? В вашем примере это тип void. Если та же самая техника используется для работы с булевым типом, как с этим бороться?
  • 0
    Добавлен пример, чтобы показать возможный способ обработки возвращаемого значения и разрыва.
Показать ещё 3 комментария
0

В итеративной версии вашей программы вычисление перемещается от 1 до n-1, но в рекурсивной версии вычисление перемещается из n-1 в 1. Таким образом, вместо рекурсии хвоста используйте рекурсию головы. И наклон должен быть статической переменной. Итак, объявите наклон как статическую переменную. Это будет работать.

  • 0
    Порядок не самая важная проблема (если это в его случае). Использование static slope уродливо, функция не будет поточно-ориентированной и заставит ее сбросить значение при выходе, чтобы позволить второй вызов ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню