Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
Ярослав91
5 / 5 / 0
Регистрация: 21.12.2009
Сообщений: 69
#1

Рекурсия, квадратные корни. - C++

10.06.2010, 15:57. Просмотров 2815. Ответов 13
Метки нет (Все метки)

Здравствуйте, очень нужна помощь с задачей на рекурсию "Написать рекурсивную функцию и её нерекурсивный аналог, произвести измерение времени работы написанных функций при разных значениях"
А вычислить нужно вот такое выражение sqrt(6+2(sqrt(7+3(sqrt(8+4(sqrt(9+... и так далее.
Саму тему рекурсия я вроде бы и понял, функция которая вызывает сама себя и т.д... но вот с этим выражением не могу применить... да и обычным методом тоже нет мыслей как считать... т.е они конечно есть, но грамотно оформить в коде чтобы работало, не получаеться(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2010, 15:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Рекурсия, квадратные корни. (C++):

Вычислить квадратные корни
Помогите пожалуйста!!! Вычислить квадратные корни из элементов 7-го столбца...

Вычислить вложенные квадратные корни из 2
Ребята помогите пожалуйста!!! Мне необходимо создать код, в котором в...

Найти квадратные корни из сум квадратов элементов каждой строки матрицы
Найти и выдать значение: квадратных корней из сум квадратов элементов каждой...

Выводить квадратные корни элементов заданной матрицы по заданным пользователем номерам столбца и строки
Вывести на экран квадратные корни элементов заданной матрицы за заданными...

Найти корни уравнений ax^3+bx^2+cx=0 и y^3-ay^2-b=0, используя процедуру. Есть ли у этих уравнений совпадающие корни?
Помогите пожалуйста решить данную задачу, на тему программирование с...

Отделить корни уравнения графически. Уточнить корни уравнения методом половинного деления
Здравствуйте, господа программисты, помогите пожалуйста код написать, очень...

13
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,525
Записей в блоге: 2
Завершенные тесты: 1
10.06.2010, 16:00 #2
sqrt(6+2(sqrt(7+3(sqrt(8+4(sqrt(9+... и так далее.
Должен быть предел, иначе получится вечный цикл)
0
Ярослав91
5 / 5 / 0
Регистрация: 21.12.2009
Сообщений: 69
10.06.2010, 16:08  [ТС] #3
ну это да, я так понимаю просто заранее указываеться кол-во корней...
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,525
Записей в блоге: 2
Завершенные тесты: 1
11.06.2010, 08:47 #4
Вот рекурсия. Аналог без рекурсии думаю проблем не создаст?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cmath>
using namespace std;
double resqrt(int,double a=6,double b=2);
int main () {
    cout<<"Enter n : ";
    int n;
    cin>>n;
    cout<<"Answer "<<resqrt(n)<<endl;                            
    system ("pause");
    return 0;
              } 
double resqrt(int n,double a,double b) {
    if (n==1)return (sqrt(a+b));
    double sq=sqrt(a+(b*(resqrt(--n,a+1,b+1))));
    return sq;
}
Вопрос к более опытным людям - почему в строке
C++
1
double sq=sqrt(a+(b*(resqrt(--n,a+1,b+1))));
если написать в параметрах ф-ции не (--n,а+1,b+1), а (--n, ++a, ++b) то результат считает не правильно? Я 20 минут метался между калькулятором и программой, пока не нашел в чем дело )))

Добавлено через 24 минуты
Забыл про время, вот показывает время, прошедшее с начала запуска программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
double resqrt(int,double a=6,double b=2);
int main () {
    cout<<"Enter n : ";
    int n;
    cin>>n;
    cout<<"Answer "<<resqrt(n)<<endl;
    cout<<"Programm work "<<clock()/CLOCKS_PER_SEC<<" sec"<<endl;                            
    system ("pause");
    return 0;
              } 
double resqrt(int n,double a,double b) {
    if (n==1)return (sqrt(a+b));
    double sq=sqrt(a+(b*(resqrt(--n,a+1,b+1))));
    return sq;
}
Добавлено через 13 часов 24 минуты
Я понял проблему с (--n,а+1,b+1) и (--n, ++a, ++b), в рекурсии вообще так делать нельзя!
1
qwertypal
1 / 1 / 1
Регистрация: 08.06.2010
Сообщений: 9
11.06.2010, 15:03 #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
если написать в параметрах ф-ции не (--n,а+1,b+1), а (--n, ++a, ++b)
++a аналогично а=а+1 , поэтому когда в конце концов происходит возврат из resqrt() значение а и b в части
C++
1
sqrt(a+(b*(resqrt(...))))
уже на единицу больше, что не верно ))))))
1
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,525
Записей в блоге: 2
Завершенные тесты: 1
11.06.2010, 15:58 #6
Да, я ж написал, что понял в чем дело.
0
Ярослав91
5 / 5 / 0
Регистрация: 21.12.2009
Сообщений: 69
12.06.2010, 16:01  [ТС] #7
Всем спасибо за ответы)
Недавно сам разобрался с проблемой, не без посторонней помощи, вот что получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream.h>
#include<math.h>
#include <ctime>
//sqrt(6+2(sqrt(7+3(sqrt(8+4(sqrt(9+
 
//sqrt(6+2(sqrt(7+3)))
double cdf(int n, int i) {
 
    if (i == n) {
        return sqrt(i + 5 + (i + 1));
    };
    return sqrt(i + 5 + (i + 1) * cdf(n, i + 1));
 
}
double fun(int n) {
    double res = 1;
    for (int i = 0; i < n; i++) {
        res = sqrt(n - i + 5 + (n + 1 - i) * res);
    }
    return res;
}
;
int main() {
    int n;
    cout << "Введи число корней: ";
    cin >> n;
    clock_t cstart = clock();
    cout <<"Результат выполнения рекурсии: "<< cdf(n, 1);
    clock_t cend = clock();
    double millis = 1000.0 * (cend - cstart) / CLOCKS_PER_SEC;
    cout << " \nВремя выполнения не рекурсивной функции " << millis << " миллисекунд(а)\n";
    cstart = clock();
    cout << "Результат выполнения не рекурсивной функции: "<< fun(n);
    cend = clock();
    millis = 1000.0 * (cend - cstart) / CLOCKS_PER_SEC;
    cout << " \nВремя выполнения не рекурсивной функции " << millis << " миллисекунд(а)\n";
    return 0;
}
Добавлено через 3 минуты
Вроде работает и с калькулятором проверял. предложенный вариант тоже приму к сведению и разберу так сказать)
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,525
Записей в блоге: 2
Завершенные тесты: 1
12.06.2010, 16:17 #8
Ярослав91, а вы ее проверяли? Как время выводит? Просто я так же пробовал, у меня оба показателя времени (до вызова ф-ции и после) одинаково в тактах, поэтому при вычитании результат 0. Я конечно понимаю, что такого не может быть, но у меня почему-то было именно так), поэтому я не стал этот код выкладывать.
0
Ярослав91
5 / 5 / 0
Регистрация: 21.12.2009
Сообщений: 69
12.06.2010, 19:27  [ТС] #9
ну у меня тоже выводит 0, но если количество корней небольшое... а если понизить частоту ЦП на буке и ввести порядка 4 тысяч корней, время выводит, несколько миллисекунд... я думал что 0 из-за быстродействия компа...

Добавлено через 8 минут
например вот:
"Введи число корней: 4900
Результат выполнения рекурсии: 4
Время выполнения не рекурсивной функции 2 миллисекунд
Результат выполнения не рекурсивной функции: 4
Время выполнения не рекурсивной функции 5 миллисекунд"
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,525
Записей в блоге: 2
Завершенные тесты: 1
12.06.2010, 20:02 #10
А у меня почему-то если большое число циклов задать, то программа вылетает, т.е. просто закрывается. Ни как не пойму почему так?

Добавлено через 1 минуту
и с твоим кодом так же...

Добавлено через 13 минут
сейчас попробовал из командной строки запустить, все нормально!
0
Ярослав91
5 / 5 / 0
Регистрация: 21.12.2009
Сообщений: 69
13.06.2010, 06:06  [ТС] #11
А время замеряет или все так же 0?
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,525
Записей в блоге: 2
Завершенные тесты: 1
13.06.2010, 10:30 #12
В твоем коде задал 5000 корней, результат время 0. Не могу понять почему так. Каждая команда ассемблера выполняется за определенное кол-во тактов, поэтому как ни крути, время должно отличаться, но эта программа упорно выдает одинаковое кол-во тактов до и после вызова ф-ции
0
Ярослав91
5 / 5 / 0
Регистрация: 21.12.2009
Сообщений: 69
13.06.2010, 14:29  [ТС] #13
да уж... действительно странно, честно говоря не знаю в чем дело
0
Ярослав91
5 / 5 / 0
Регистрация: 21.12.2009
Сообщений: 69
15.06.2010, 10:26  [ТС] #14
ну вот например... все работает

Рекурсия, квадратные корни.
0
15.06.2010, 10:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2010, 10:26
Привет! Вот еще темы с решениями:

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

квадратные уравнение
где здесь ошибка, (использую консол Билдера) #include &lt;iostream.h&gt; #include...

Квадратные матрицы
Есть квадратные матрицы А и В. Как получить матрицу АВ-ВА?

Квадратные уравнения
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru