2014-11-18 2 views
1
#include <stdio.h> 
int findnumb(int max) 
{ 
    static int total=2; 
    static int desk=1; 
    if(total>max) 
    { 
    return 0; 
    } 
    else 
    { 
     if(desk>=total) 
     { 
     total++; 
     desk=1; 
     return findnumb(max); 
     } 
     else 
     { 
     desk++; 
     int left=desk*(desk-1)/2; 
     int right=(total*(total+1)/2)-(desk*(desk+1)/2); 
      if(left==right) 
      { 
      printf("Desk number %d, number of participants %d\n", desk, total); 
      return findnumb(max); 
      } 
     return findnumb(max); 
     } 
    } 
} 



main() 
{ 
    int max; 
    printf("Enter the upper bound:\n"); 
    scanf(" %d", &max); 
    printf("------------------------\n"); 
    findnumb(max); 
    printf("Search is complete"); 

} 

Это для загадке, как это:Программа сбой и возвращает код 255

Предположим, что существует совещание, и мы не знаем, сколько людей посещают его. Однако мы видим, как человек уходит с заседания. Если мы спросим человека, сколько людей существует на собрании, он просто отвечает «Я не знаю». Тем не менее он говорит: «Я сидел на стуле с номером х, и суммирование чисел ниже и выше меня равно. Другими словами, если число стула равно x, то 1,2,3 ... .x-1 = x + 1 x + 2 ... ... t-1, t (общее количество участников). Кроме того, мы не знаем значения t и номера стула x. Итогом участника 8, а номер стула 6 является примерной конфигурацией. Потому что 1 + 2 + 3 + 4 + 5 = 7 + 8 = 15. Ваша задача - найти похожие конфигурации по одной попытке.

И он хочет, чтобы решение реализовало рекурсивную функцию.

Так что, когда я запускаю этот код, он не может управлять значением scanf'е больше 360 при сбое и завершении с кодом возврата 255, так как я могу исправить эту проблему?

+0

Возможно, это переполнение стека ... –

+0

Конечно, переполнение стека число рекурсивных вызовов равно O (n^2) -> для 360 -> так как 360^2 = 129600 рекурсивный вызов в стеке :) –

+0

Поздравляем, вы нашли основную цель рекурсии вне теории алгоритмов: сжигание всей доступной ОЗУ и создание переполнения стека. В качестве бонуса ваша программа также работает намного медленнее, чем в противном случае, и гораздо менее удобочитаема. – Lundin

ответ

5

Вы ничего не сказали о своей платформе, а коды выхода обычно зависят от платформы.

Однако возможная причина (по иронии судьбы) переполнение стека! Мало того, что имя этого сайта, но это настоящая вещь.

Все системы имеют практический предел для рекурсии, и, если честно, 360 - это нагрузка рекурсии.

Возможно, вы можете изменить размер стека в директиве или опции компилятора. Если нет, вам, возможно, придется «разгадать» рекурсивный код в последовательную программу.

Часто бывает, что вы можете выделить больше места из кучи, чем система будет принимать в рекурсивных вызовах.

Смежные вопросы