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

Перевод из Pascal в С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
05.07.2012, 15:39     Перевод из Pascal в С++ #1
Для заданного целого N вычислить значение суммы(с помощью рекурсии)
Pascal
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
const n = 4;
 
function f(const lvl : integer; sum : integer) : real;
var
   s : real;
   i : integer;
begin
   if lvl = 0 then f := 1 / sum
   else
   begin
      s := 0;
      for i := 1 to n do s := s + f(lvl - 1, sum + i);
      f := s;
   end
end;
 
var s : real;
    i1, i2, i3, i4 : integer;
begin
   // Это все - для проверки, правильно ли работает рекурсия
   s := 0;
   for i1 := 1 to n do
      for i2 := 1 to n do
         for i3 := 1 to n do
            for i4 := 1 to n do
               s := s + 1 / (i1 + i2 + i3 + i4);
   writeln(s:12 :8);
 
   // Вот он, вызов функции:
   writeln(f(n, 0):12 :8);
end.
Теперь о том, как это работает:
на примере N = 2.
Что надо посчитать при N = 2? Вот что:
(1/(1+1)+1/(1+2))+(1/(2+1)+1/(2+2))
При lvl=2 будет считаться вся формула, при lvl=1 - только то, что в первой или второй скобке, при lvl=0 - будет считаться каждое из слагаемых внутри скобки.

f(2, 0) = f(1, 0 + 1) + f(1, 0 + 2)
Однако, условие окончания рекурсии не достигнуто, lvl = 1, поэтому продолжаем раскрывать дальше:
= (f(0, 1 + 1) + f(0, 1 + 2)) + (f(0, 2 + 1) + f(0, 2 + 2))
А теперь смотрим на формулу сверху. Не правда ли, если взять и единицу разделить на второй параметр, то получится как раз то, что нам надо? И случай как раз подходящий: lvl = 0, дальше раскрывать формулу не нужно. Поэтому просто возвращаем тут значения, и начинаем "раскручивать" рекурсию в обратном направлении, то есть, просто суммируем то, что вернулось из более глубоких вызовов. И получаем результат...

Нужен перевод в С++
Миниатюры
Перевод из Pascal в С++  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2012, 15:39     Перевод из Pascal в С++
Посмотрите здесь:

C++ Перевод с С++ на Pascal
Перевод с Pascal на С++ C++
C++ Перевод с Pascal на С++
C++ Перевод с Pascal на С++
Перевод из Pascal в C++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
05.07.2012, 15:55     Перевод из Pascal в С++ #2
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
40
#include "iostream"
#include "iomanip.h"
 
const int n = 4;
 
double f(const int lv1, int sum)
{
   double s;
   int i;
 
   if (lv1 == 0)
      return 1.0 / summ;
   else
   {
      s = 0;
      for (i=1; i<=n; i++)
         s = s + f(lv1 - 1, sum + i);
      return s;
   }
}
 
int main()
{
   double s;
   int i1, i2, i3, i4;
 
   s = 0;
   for (i1 = 1; i <= n; i++)
      for (i2 = 1; i2 <= n; i2++)
         for (i3 = 1; i3 <= n; i3++)
            s = s + 1.0 / (i1 + i2 + i3);
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << s << endl;
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << f(n, 0) << endl;
 
   return 0;
}
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
05.07.2012, 16:09  [ТС]     Перевод из Pascal в С++ #3
Цитата Сообщение от Intel~lect Посмотреть сообщение
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
40
#include "iostream"
#include "iomanip.h"
 
const int n = 4;
 
double f(const int lv1, int sum)
{
   double s;
   int i;
 
   if (lv1 == 0)
      return 1.0 / summ;
   else
   {
      s = 0;
      for (i=1; i<=n; i++)
         s = s + f(lv1 - 1, sum + i);
      return s;
   }
}
 
int main()
{
   double s;
   int i1, i2, i3, i4;
 
   s = 0;
   for (i1 = 1; i <= n; i++)
      for (i2 = 1; i2 <= n; i2++)
         for (i3 = 1; i3 <= n; i3++)
            s = s + 1.0 / (i1 + i2 + i3);
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << s << endl;
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << f(n, 0) << endl;
 
   return 0;
}
Спасибо вам большое! А вы не проверяли, это работает? Просто я пока не могу сама проверить
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
05.07.2012, 16:15     Перевод из Pascal в С++ #4
Нет, еще не проверял. Сейчас просто возможности нет
Yandex
Объявления
05.07.2012, 16:15     Перевод из Pascal в С++
Ответ Создать тему
Опции темы

Текущее время: 21:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru