где логика неверна? - PullRequest
       1

где логика неверна?

0 голосов
/ 24 апреля 2011

я написал memoized код для вычисления факториала числа в C. Но при вводе как n=3 он дает вывод как 6! = 134513904. Может кто-нибудь объяснить, пожалуйста, что происходит не так?

int fact(int n)
{
int temp;
static int lookup_table[100];
if(lookup_table[n])
    return lookup_table[n]; 
else if(n == 0 )
{
    lookup_table[0]= 1;
    return 1;
}   
else
{
    temp = n * fact(n-1);
    lookup_table[n] = temp;
    return temp;
}

}

Ответы [ 3 ]

5 голосов
/ 24 апреля 2011

Одной из проблем может быть то, что вы никогда не инициализируете свою таблицу, поэтому она заполнена тем, что происходит в памяти.

Редактировать: Ах, кажется, яневерно и что поведение хорошо определено:

Если объект, имеющий статическую продолжительность хранения, не инициализируется явно, он инициализируется неявно, как если бы каждому члену, имеющему арифметический тип, был присвоен 0, и каждому члену, которыйДля типа указателя была назначена нулевая константа указателя.

Источник

4 голосов
/ 24 апреля 2011

Ваш printf (из комментария) не имеет правильного количества аргументов и поэтому печатает значение мусора:

printf("\n%d! = %d\n",result);

Вопреки тому, что сказали другие, массив не нужно инициализировать явно, как говорит стандарт C:

Если объект, имеющий автоматическую продолжительность хранения, не инициализируется явно, его значение является неопределенным. Если объект со статической продолжительностью хранения не инициализирован явно, то:

  • если он имеет тип указателя, он инициализируется нулевым указателем
  • если он имеет арифметический тип, он инициализируется (положительным или беззнаковым) нулем
  • если это агрегат, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами
  • если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами.

Тем не менее, это хорошая практика для явной инициализации, чтобы прояснить ваши намерения.

0 голосов
/ 24 апреля 2011

Как я и подозревал, проблема в printf, а не в функции.

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