2015-02-19 3 views
-3

я следующую степенную функцию, что я написал в C#:Почему эта функция питания вызывает переполнение стека C#

public static double pow2(double x, double n) 
{ 
    if (n == 0) 
     return 1; 
    else 
    { 
     stepAccumulator++; 
     return pow2 (x, Math.Floor (n/2.0)) * pow2 (x, Math.Ceiling (n/2)); 
    } 
} 

Когда я запускаю программу, я просто сказать result=pow2(1,1000);, а затем время функции, используя Stopwatch объект, а затем распечатать результат в конце. К сожалению, когда я запускаю эту программу, я получаю следующую ошибку: Процесс завершается из-за StackOverflowException. Почему это происходит и как я могу остановить его?

+5

Еще раз я должен спросить: больше не нужно отлаживать код? Наверняка вы поставили бы точку останова наверху и каждый раз проверяли значение 'n'? Если вы сделали это, почему бы не сказать нам результаты? Если вы этого не сделали, почему бы не сделать это? – John3136

+5

, потому что n/2 никогда не 0 –

+0

Nah, n достигает 0. В точке останова n = 1000, n = 500, n = 250, n = 125, .. n делится на два каждый раз и как только достигает 0, это никогда не возвращает 1 с 'if (n == 0) {return 1;}' и просто продолжает колебаться между 0.0 и 1.0 – Chizx

ответ

5

Ваш Math.Ceiling(n/2) случай никогда не будет звонить pow с n == 0, потому что Math.Ceiling(1/2) == 1. После того, как ваш pow2 вызывается с n == 1 следующие два вызова будут:

return pow2 (x, Math.Floor (1/2.0)) * pow2 (x, Math.Ceiling (1/2)); 

Что такое же, как:

return pow2 (x, 0) * pow2 (x, 1); 

Какие результаты в другом вызове pow2 с n == 1, поэтому алгоритм никогда не заканчивается

+0

Большое спасибо. Это ответ, который я искал. К сожалению, должен быть способ решить этот алгоритм. Это было дано как указание мне сделать функцию власти, которая работает с этим точным рекурсивным вызовом. Возможно, есть способ переписать эту функцию в функцию рабочей мощности? Инструкция была дана мне моим профессором, у которого есть кандидат в Алгоритмы. У этого должен быть способ работать, я должен был написать его неправильно. – Chizx

+0

Для этого вам нужно будет проверить свои инструкции. Ваш алгоритм не похож на нормальную рекурсивную реализацию власти. Обычно у них есть только один рекурсивный вызов, например, примеры: http://stackoverflow.com/questions/22389184/recursive-power-function-approach – shf301

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