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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Heidel
111 / 111 / 7
Регистрация: 11.10.2011
Сообщений: 647
#1

Предупреждение в программе с рекурсивными функциями - C++

11.10.2011, 13:04. Просмотров 1316. Ответов 15
Метки нет (Все метки)

Вопрос по институтскому заданию.
Задача. Описать рекурсивные функции для определения pi, hi. Задать значение z и вычислить с.
p1=cos 1; p2=-sin1; h1=0.5; h2=sin0.5; pi=2p(i-1)-p(i-2); hi=z*h(i-1)+h(i-2); c=p9/h3+p4

Программа
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
39
#include <iostream.h>
#include <math.h>
 
double pFunction (int i);
double hFunction (int i, int z);
 
int main ( )
{
double c;
int z;
cout << "Input z=";
cin>> z;
 
c=pFunction (9)/hFunction (3, z)+pFunction (4);
cout << "c="<< c << endl;
 
return 0;
}
 
 
double pFunction (int i) //Рекурсивная функция для вычисления p
{
    if (i==1)
        return cos (1);
    if (i==2)
        return -sin (1);
    if (i>=3)
        return (2*pFunction (i-1) - pFunction (i-2));
}
 
double hFunction (int i, int z) //Рекурсивная функция для вычисления h
{
    if (i==1)
        return 0.5;
    if (i==2)
        return sin (0.5);
    if (i>=3)
        return (z*hFunction (i-1, z) + hFunction (i-2,z));
}
При компиляции выдает два предепреждения
warning C4715: 'pFunction' : not all control paths return a value
warning C4715: 'hFunction' : not all control paths return a value

Что неверно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2011, 13:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Предупреждение в программе с рекурсивными функциями (C++):

Проблема с рекурсивными функциями на Lisp - Lisp
надо написать две программы с использованием рекурсии на лисп 1)оставляет в списке х из каждой группы подряд идущих одинаковых элементов...

Задачи с рекурсивными функциями и перегрузкой функций - C (СИ)
Здравствуйте, нужно доделать лабу, большинство задач сделала, а эти не могу, не знаю как делать. Помогите пожалуйста. 7. ...

Предупреждение в программе - Matlab
Скажите, я написал код цифрового фильтра, но при запуске выдается предупреждение, оно влияет на дальнейшие действия или нет? ...

Как работать с рекурсивными шагами? - C (СИ)
Например, у меня работает функция, и всё в ней меня устраивает, но вот мне потребовалось сохранить эту функцию и вызвать новую. В...

Вычисление числа Фибоначчи обычной рекурсией с двумя рекурсивными вызовами - Prolog
Напишите в турбо прологе программу с предикатом fibo, вычисляющее числа фибоначи обычной рекурсии с двумя рекурсивными вызовами.

В чем различие между функциями VBA и функциями Excel? - VBA
В чем различие между функциями VBA и функциями Excel. Скажите пожалуйста , в гугле не могу найти)

15
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 13:14 #2
Цитата Сообщение от Heidel Посмотреть сообщение
warning C4715: 'pFunction' : not all control paths return a value
warning C4715: 'hFunction' : not all control paths return a value
"Не все пути выполнения возвращают значение".

C++
1
2
3
4
5
6
7
8
9
10
11
double hFunction (int i, int z) //Рекурсивная функция для вычисления h
{
        if (i==1)
                return 0.5;
        if (i==2)
                return sin (0.5);
        if (i>=3)
                return (z*hFunction (i-1, z) + hFunction (i-2,z));
 
       // а что, если i == -12? Что тогда возвращать?
}
0
IIIa66uMEM6eP
заставил Бендера
436 / 292 / 10
Регистрация: 05.12.2010
Сообщений: 1,646
Записей в блоге: 6
11.10.2011, 13:17 #3
Чуть чуть переделал. Зря объявляли просто в начале функции, а потом внизу в подпрограмме опять их объявляли.
Среда DEV-cpp

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
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
double pFunction (int i) 
{
        if (i==1)
                return cos (1);
        if (i==2)
                return -sin (1);
        if (i>=3)
                return (2*pFunction (i-1) - pFunction (i-2));
}
 
double hFunction (int i, int z) 
{
        if (i==1)
                return 0.5;
        if (i==2)
                return sin (0.5);
        if (i>=3)
                return (z*hFunction (i-1, z) + hFunction (i-2,z));
}
int main(int argc, char *argv[])
{
    
    double c;
int z;
cout << "Input z=";
cin>> z;
 
c=pFunction (9)/hFunction (3, z)+pFunction (4);
cout << "c="<< c << endl;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 2 минуты
эээ поспешил я, оно то компилируется но правильно ли работает?
0
Heidel
111 / 111 / 7
Регистрация: 11.10.2011
Сообщений: 647
11.10.2011, 13:25  [ТС] #4
IIIa66uMEM6eP, а что изменилось то? при компиляции твоего кода выдаются точно такие же предупреждения.


talis, а так?

C++
1
2
3
4
5
6
7
8
9
10
11
double pFunction (int i) //ÐåêóðñèâГ*Г*Гї ГґГіГ*êöèÿ äëÿ âû÷èñëåГ*ГЁГї p
{
    if (i==1)
        return cos (1);
    if (i==2)
        return -sin (1);
    if (i>=3)
        return (2*pFunction (i-1) - pFunction (i-2));
    else 
        return 0;
}
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 13:29 #5
Heidel, да, как-то так. Только else там бессмысленный, его можно убрать. Ну и вообще, подойдёт ли вам ноль, или нужно какое-то другое значение?
0
Heidel
111 / 111 / 7
Регистрация: 11.10.2011
Сообщений: 647
11.10.2011, 13:38  [ТС] #6
talis, ок, написала вот так
C++
1
2
3
4
5
6
7
8
9
10
double pFunction (int i) //ÐåêóðñèâГ*Г*Гї ГґГіГ*êöèÿ äëÿ âû÷èñëåГ*ГЁГї p
{
    if (i==1)
        return cos (1);
    if (i==2)
        return -sin (1);
    if (i>=3)
        return (2*pFunction (i-1) - pFunction (i-2));
    return EXIT_SUCCESS;
}
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 13:40 #7
*facepalm*

#define EXIT_SUCCESS 0
Что изменилось? Проверьте математическую сторону вашего алгоритма. Как он отнесётся к тому, что эта функция вернёт ноль? Возможен ли такой сценарий?
0
-=ЮрА=-
11.10.2011, 13:46
  #8

Не по теме:

Вопрос к ТС

Цитата Сообщение от Heidel Посмотреть сообщение
double pFunction (int i) //Рекурсивная функция для вычисления p
{
* * * * if (i==1)
* * * * * * * * return cos (1);
* * * * if (i==2)
* * * * * * * * return -sin (1);
* * * * if (i>=3)
* * * * * * * * return (2*pFunction (i-1) - pFunction (i-2));
* * * * return EXIT_SUCCESS;
}
- как Пи собрался вычислить через косинус и синус единицы, вообще бред, может арксинус нужен, да например арксинус 1 - это Пи на два

0
Nameless One
11.10.2011, 13:48
  #9

Не по теме:

-=ЮрА=-, там не http://www.cyberforum.ru/cgi-bin/latex.cgi?\pi, там http://www.cyberforum.ru/cgi-bin/latex.cgi?p_i. Просто ТС не знает о latex-разметке

0
aeshes
11.10.2011, 13:49
  #10

Не по теме:

-=ЮрА=-, в задаче через pi обозначено не математическое Пи, а i-й член последовательности р
упс, не успела

0
Heidel
111 / 111 / 7
Регистрация: 11.10.2011
Сообщений: 647
11.10.2011, 13:50  [ТС] #11
Nameless One, а как сделать
Цитата Сообщение от Nameless One Посмотреть сообщение
latex-разметку
?
0
-=ЮрА=-
Заблокирован
Автор FAQ
11.10.2011, 13:50 #12
Вот так Пи можно вычислить
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    std::cout<<"PI = asin(1)*2 : "<<asin(1)*2<<"\r\n";
    system("pause");
    return 0;
}
0
Миниатюры
Предупреждение в программе с рекурсивными функциями  
-=ЮрА=-
11.10.2011, 13:52
  #13

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Не по теме:
-=ЮрА=-, там не , там . Просто ТС не знает о latex-разметке
- аааа ну тогды ясно, сам себе всё усложнил

0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 13:52 #14
Heidel, над формой быстрого ответа есть редактор формул, похожий на редактор формул в Word, в нем и набираете
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
11.10.2011, 14:05 #15
Я бы сделал так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double p(int i)
{
   double result;
   switch(i)
   {
   case 0:
      abort();
 
   case 1:
      result = cos(1.);
      break;
 
   case 2:
      result = - sin(1.);
      break;
   
   default:
     result = 2 * p(i - 1) - p(i - 2);
   }
   
   return result;
}
Или так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double p(int i)
{
   if(i == 0)
   {
       abort();
       return 0; // never gonna be executed
   }
   if(i == 1)
       return cos(1.);
   if(i == 2)
       return - sin(1.);
   
   return 2 * p(i - 1) - p(i - 2);
}
Или бы вообще сдвинул индексы так, чтобы они начинались с нуля:
C
1
2
3
4
5
6
7
8
double p(size_t i)
{
   if(i == 0)
      return cos(1.);
   if(i == 1)
      return - sin(1.);
   return 2 * p(i - 1) - p(i - 2);
}
Nameless One, а как сделать latex-разметку
Взять какую-нибудь книгу по http://www.cyberforum.ru/cgi-bin/latex.cgi?\LaTeX (я бы посоветовал "Набор и верстка в системе http://www.cyberforum.ru/cgi-bin/latex.cgi?\LaTeX" Львовского), и почитать главу о наборе математических формул. Формулы набираются в парном теге [latex][/latex]. Ну или, как посоветовали выше, воспользоваться редактором формул
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2011, 14:05
Привет! Вот еще темы с ответами:

Сделать функции рекурсивными (Одна функция поиска в списке а другая удаления узла из списка) - C (СИ)
здраствуйте помогите пожалуйста сделать две функции рекурсивными я ломал голову но так и не вышло :wall: одна функция поиска в списке...

написать коментарии к программе и исправить ошибку в одной программе - Assembler
и впрграмме mass нужно найти ошибку

Выбрать файл с БД в программе и совершать с этой БД действия в программе - C#
вообщем проект реализует Тест знаний, работает на БД (xml - ну его), все получилось кроме одного, как сделать, чтобы по нажатию...

Составить блок-схему к программе 1 и к программе 2 - Turbo Pascal
1) var i, multiply,result:longint; digit:byte; fail:boolean; begin writeln('Input binary number:'); ...


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

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

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