Помогите с проблемой переполнения стека!

#c

#c

Вопрос:

Во-первых, я хотел бы сказать, что это моя первая попытка создать рекурсивную функцию для моего класса программирования! В любом случае, задача состоит в том, чтобы найти корень любого натурального целого числа, используя рекурсию (абсолютно без итераций). Мой код корректно вычисляет квадратный корень из любого положительного числа, но когда я пытаюсь извлечь, скажем, четвертый или третий корень из числа, я получаю ошибку переполнения стека. Я опубликую свой код, и буду очень признателен за любую помощь. Взрывайте, если чувствуете необходимость, хах.

 #include<iostream>
#include<iomanip>
#include<cstdlib>
using namespace std; 

double squareRoot (int root, double number, double low, double high); 

int main() {
    int root = 0; 
    double number; 
    double low, high; 
    double guess = 0;
    double error = 0; 
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint); 

    do
    {
        cout << "Find what root? (0 ends): "; 
        cin >> root; 
        if (root == 0)
        {
            exit(1); 
        }
        else
        {
            cout << "Root of what value? "; 
            cin >> number;
        }
        low = number - (number - 1);  
        high = number;
        cout << "root " << root << " of " << setprecision(4) << number << " is " << setprecision(10) << squareRoot (root, number, low, high) << endl; 
    }while (root != 0);  

    cin.get(); 
    cin.get(); 
    return 0; 
}

double squareRoot (int root, double number, double low, double high)
{
    cout.setf(ios::fixed); 
    cout.setf(ios::showpoint); 
    cout.precision(10); 
    double guess = (high   low) / double(root); 
    double error = abs(number - (guess * guess));  
    if ((guess * guess) == number || error <= 0.000000000001)
    {   
        return guess; 
    }
    else if ((guess * guess) > number)
    {
        high = guess;  
        return squareRoot(root, number, low, high); 
    }
    else
    {
        low = guess; 
        return squareRoot(root, number, low, high); 
    }
}
  

Комментарии:

1. Знаете ли вы, в какой момент возникает ошибка? Вы пробовали отлаживать свою программу?

2. Поскольку squareRoot() функция не выполняет никаких операций ввода-вывода, она не должна изменять свойства cout ; это неправильное сочетание функциональных возможностей.

3. Я отлаживал свою программу, и из моей интерпретации казалось, что ошибка произошла в функции «return squareRoot» в инструкции else. Это выглядело так, как будто оператор else в моей функции вызывался много раз, и ему не хватило места? Я уверен, что есть гораздо более эффективный способ работы с этой программой, но я его упускаю.

4. Если вы подумаете об этом, вы поймете, что это number - (number - 1) упрощает просто 1 .

Ответ №1:

Вы получаете переполнение стека, потому что вы бесконечно повторяете; вы никогда не находите ответ.

Возьмите карандаш и бумагу и выполните рекурсию с помощью входных данных (скажем, 3 для корня и 8 для значения) … выясните, почему ваша логика решения не работает.

Ответ №2:

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

Как уже говорилось выше, возьмите карандаш и бумагу и начните копаться.

Ответ №3:

Вот подсказка:

Ваша функция вызывается, squareRoot и она содержит guess * guess в нескольких местах, так для чего же нужен int root параметр?