Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

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

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

10.06.2010, 15:57. Просмотров 2301. Ответов 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++):

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

Найти квадратные корни из сум квадратов элементов каждой строки матрицы - C++
Найти и выдать значение: квадратных корней из сум квадратов элементов каждой строки. Добавлено через 2 минуты float S=0; ...

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

Отделить корни уравнения графически. Уточнить корни уравнения методом половинного деления - C++
Здравствуйте, господа программисты, помогите пожалуйста код написать, очень нужна ваша помощь) Вот задание: " Отделить корни уравнения...

Квадратные уравнения - C++
#include <iostream> #include <math.h> using namespace std; int main() { float a,b,c,d,di,x1,x2; cout<<"a=";cin>>a; ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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 / 0
Регистрация: 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
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2010, 10:26
Привет! Вот еще темы с ответами:

Квадратные уровнения - C++
помогите написать код. программа должна: решить квадратное уравнение по трем коэффициентам. даны a, b и c напишите как можно это...

квадратные уравнение - C++
где здесь ошибка, (использую консол Билдера) #include &lt;iostream.h&gt; #include &lt;math.h&gt; int main() { float a,b,c,x1,x2,d; ...

Квадратные уравнения - C++
Пишу программу для решения квадратных уравнений. Вроде бы простая задача, но вот меня она в ступор ввела. Не решает не одно уравнение....

Квадратные скобки [] - C++
Здравствуйте! Объясните, пожалуйста, значение квадратных скобок в следующих строчках: delete contData; int&amp;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.06.2010, 10:26
Ответ Создать тему
Опции темы

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