У меня есть 2 вопроса: у меня есть рекурсивная функция M (n) = 3 * M (n / 2) + 2 * n + 1 и итерационная функция T (n) = n ^ 2
#include<stdlib.h>
#include<bits/stdc++.h>
using namespace std;
int M(int n)
{
if (n == 1)
return n;
return 3*M(n/2)+2*n+1;
}
int T(int n)
{
return n^2;
}
int main ()
{
cout<< "Cost is "<< M(768)<<"\n";
getchar();
return 0;
}
Я хотел бы запустить 5 уровней рекурсивной функции M для n = 768, а затем вставить функцию T, как показано ниже:
M (768) = 3 * M (384) + O (n)
M (384) = 3 * M (192) + O (n)
M (192) = 3 * M (96) + O (n)
M ( 96) = 3 * M (48) + O (n)
M (48) = 3 * M (24) + O (n)
Теперь я хотел бы, чтобы моя программа остановилась здесь при n = 24 и вставьте $ T (24) = 24 ^ 2 $ вместо M (24).
Другими словами, я хотел бы объединить функции M (n) и T (n) в этом way.
Но я не мог организовать рекурсивный код таким образом. Может кто-то помочь мне с этим? Нужно ли преобразовывать M (n) в итеративную функцию для достижения моей цели или я могу просто исправить рекурсию? Если так, как я могу преобразовать в итеративную функцию?
Мой второй вопрос:
Если я запускаю код для M (n) до базового случая n = 1, я получаю ошибку, поскольку для 768 = 3 * 256 и 3 не делится на 2 точно. Как я могу это исправить только для M (n)?