#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
параметр?