Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2021, 21:21   #1
Александр222
Пользователь
 
Регистрация: 15.04.2020
Сообщений: 59
Вопрос Рекурсивный спуск. С++

Нужно было решить задачу методом динамического программирования(решение ниже). Кто-нибудь может рассказать о рекурсивном спуске? Где, что почитать. Потому что все, что я имею сейчас, это небольшой пример ниже.(Так как эту задачу теперь необходимо решить рекурсивным спуском)

UPD: Добавил решение с рекурсией данной задачи, но не уверен, что это можно назвать рекурсивным спуском

Безымянный.jpg

Решение методом динамического программирования:
Код:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;


double minPoly( const string &S, double x )
{
   int LEN = S.size();

   vector< vector< vector<double> > > P( LEN, vector< vector<double> >( LEN, vector<double>( LEN, 0.0 ) ) );

   for ( int i = 0; i < LEN; i++ ) P[i][i][0] = S[i] - '0';                   

   for ( int run = 2; run <= LEN; run++ )                                   
   {                                                 
      for ( int i = 0, j = i + run - 1; i <= LEN - run; i++, j++ )          
      {
         P[i][j][0] = 10 * P[i][j-1][0] + P[j][j][0];                         
         for ( int deg = 1; deg < run; deg++ )                             
         {
            P[i][j][deg] = P[i][i][0] + x * P[i+1][j][deg-1];                 
            for ( int c = i + 1; c < j - deg + 1; c++ ) P[i][j][deg] = min( P[i][j][deg], P[i][c][0] + x * P[c+1][j][deg-1] );
         }
      }
   }

   return *min_element( P[0][LEN-1].begin(), P[0][LEN-1].begin()+LEN );       
}


int main()
{
   string S;
   double x;
   cout << "Input S: ";   cin >> S;
   cout << "Input x: ";   cin >> x;
   cout << "Minimum polynomial is " << minPoly( S, x ) << '\n';
}
С использованием рекурсиии
Код:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;


double minPoly( const string &S, int i, double P1, double P2, double x, double xpower )
{
   if ( i == S.size() ) return P1 + P2;
   int digit = S[i] - '0';
   double left  = minPoly( S, i + 1, P1     , 10 * P2 + xpower * digit, x, xpower     );
   double right = minPoly( S, i + 1, P1 + P2,   ( xpower * x ) * digit, x, xpower * x );
   return min( left, right );
}


double minPoly( const string &S, double x )
{
   return minPoly( S, 1, 0, S[0] - '0', x, 1 );
}


int main()
{
   string S;
   double x;
   cout << "Input S: ";   cin >> S;
   cout << "Input x: ";   cin >> x;
   cout << "Minimum polynomial is " << minPoly( S, x ) << '\n';
}

Последний раз редактировалось Александр222; 16.05.2021 в 10:42.
Александр222 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсивный спуск(вопросы в коде) syrga Qt и кроссплатформенное программирование С/С++ 1 23.03.2013 17:04
Рекурсивный спуск и подъем Vesteros Помощь студентам 0 10.05.2011 15:23
Градиентный спуск Ciberal Помощь студентам 0 26.12.2010 19:23
Градиентный спуск nieaCry Общие вопросы C/C++ 0 04.12.2008 00:26