Почему я получаю ошибку «Необработанное исключение» и как ее исправить? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь написать код, использующий 2 рекурсивные функции; 'I' и 'U' и одна нерекурсивная функция 'f' . Я пытаюсь выполнить рекурсивную функцию I "steps1" много раз , а затем остановиться на этом уровне, чтобы затем запустить рекурсивный функция U "шаги2" много раз . После этого, наконец, запустите нерекурсивную функцию f на уровне, где заканчивается итерация функции U .

Например:

Пусть шаги1 = 1 и шаги2 = 1 , тогда

Я буду повторять функцию 'I' , 1 раз (шаги 1) и получаю:

   I(n)= 3*I(n/2)+7*n-3  

, тогда я буду повторять функцию U , 1 раз (шаги 2) для n / 2 значение. И затем вставьте его вместо I (n / 2) , таким образом я вычислю:

    I(n)= 3*[U(n/2)]+7*n-3= 3*[2*U(n/6)+2*(n/2)-9] = 3*2*U(n/6)+3*2*(n/2)-3*9 

теперь вставьте последнюю функцию f (n / 6) , в это уравнение:

        3*2*U(n/6)+3*2*(n/2)-3*9=3*2*f(n/6)+3*2*(n/2)-3*9 

, поскольку f нерекурсивен, это даст мне результат.

Когда я запустил свой code Я получаю сообщение об ошибке "необработанное исключение". Может ли кто-нибудь помочь мне найти причину этой ошибки? Где-то мой код неправильный? Может кто-нибудь помочь мне исправить это, пожалуйста? Я не уверен, что мой код делает именно то, что я хочу делать?

#include<stdlib.h>
#include<bits/stdc++.h> 
using namespace std; 


int f(int n) 
{ 
   return (n-1)*(n-1);

} 

 /* step2 many iteration of the function U and then function f */
int U(int n , int steps2, int counter2=0) 
{ 

   if(counter2==steps2){
        return f(n);
      } 

    return 2*U(n/3, steps2, counter2+1)+2*n-9; 

} 

/* step1 many iteration of  the function I and then function U*/
int I(int n , int steps1,int steps2, int counter1=0, int counter2=0) 
{ 

   if(counter1==steps1){
        return U(n,steps2,counter2);
      } 

    return 3*I(n/2, steps1, counter1+1)+7*n-3; 

} 


int main(){

    int n, steps1,steps2;
   cout<< " Enter 'n' value which is divisable by both 2 and 3"<<"\n";
   cin>>n;
    cout<< " Enter iteration count for I"<<"\n";
   cin>>steps1;
    cout<< " Enter iteration count for U"<<"\n";
   cin>>steps2;
   cout<< " result:" << I(n,steps1,steps2)<<"\n";

     getchar(); 
     return 0; 

 }

1 Ответ

2 голосов
/ 06 мая 2020

Я скомпилировал и запустил вашу программу, и похоже, что у вас переполнение стека. Рекурсия для функции I неверна. А именно, ваш базовый вариант никогда не будет достигнут. В каждом месте, которое вызывается I, вы передаете только 3 параметра, поэтому counter1 всегда будет иметь значение 0, значение по умолчанию. Кроме того, всегда вызывается I, так что steps1 всегда будет иметь одно и то же значение (из ввода пользователя). Так что if(counter1==steps1){ никогда не будет правдой.

Несколько советов для будущих проблем. При устранении проблем, подобных этой, одна из самых простых вещей, которую вы можете сделать, - это добавить cout в начало каждой функции. Выведите имя функции и значения параметров. Другой вариант - подключить отладчик и установить несколько точек останова. Очень и очень пригодится изучение того, как использовать отладчик с C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...