Вот ссылка на код, и я также разместил ее ниже.
#include<math.h>
void pentagon(int n)
{
int k,p[10],a[10],b[10];
if(n<0)
p[n]=0;
if(n==0)
p[n]=1;
for(k=1;k<n;k++)
{
a[k]=((3*pow(k,2))-k)/2;
b[k]=((3*pow(k,2))+k)/2;
}
for(k=1;k<n;k++)
{
p[n]=pow(-1,k-1)(pentagon(n-a[k])+pentagon(n-b[k]));
}
cout<<p[n];
}
int main()
{
pentagon(4);
return(0);
}
Я получаю следующую ошибку:
В функции 'void pentagon(int)': Строка 11: ошибка: вызов перегруженного 'pow(int&, int)' является неоднозначной компиляцией, завершенной из-за -Wfatal-ошибок
p[n]=pow(-1,k-1)*(pentagon(n-a[k])+pentagon(n-b[k]));
(обратите внимание на*
) или что-то подобное. Другая ошибка заключается в том, чтоpentagon
ничего не возвращает (пока?), но вы используете ее как функцию, возвращающуюint
. - person schnaader   schedule 11.03.2011pow(k,2)
на(k * k)
. Как правило, основные арифметические функции выполняются быстрее, чем вызов более сложных функций. - person Thomas Matthews   schedule 11.03.2011pow(-1, k-1)
кажется странным. Это эквивалентно1/pow(-1, k)
. Знаменатель либо 1, либо -1. Так почему показатель степени отрицательный? Это выражение можно заменить на(k % 2) ? -1 : 1
. Я что-то пропустил? - person Thomas Matthews   schedule 11.03.2011p
не нужен и может быть заменен одной переменной. Во время рекурсии ни одно из предыдущих значений не запоминается; это как новый чистый лист. Кроме того,p[n]
никогда не упоминается (в правой части) каких-либо выражений (за исключениемcout
). Таким образом, его можно упростить до одной переменнойp
. Если ваша функция закодирована неправильно. - person Thomas Matthews   schedule 11.03.2011pow(-1, k-1)
правильно. Он вернет -1 для четных, 1 для нечетныхk
. И я думаю, что использованиеp
в качестве массива правильно для динамического программирования, но здесь действительно не имеет смысла (также см. вывод моего ответа, показывающий, что что-то не так).p
, возможно, должен быть глобальным, но это тоже мало помогает. - person schnaader   schedule 11.03.2011for
индекс дляp
никогда не меняется. Вы также можете упростить его, чтобы он использовал последнее значениеk
в итерации, то естьn
. Заменаn
наk
приводит к интересному упрощению, указывая на то, что предыдущий циклfor
также можно упростить. - person Thomas Matthews   schedule 11.03.2011