2013-10-07 6 views
0

У меня есть вопрос о следующих алгоритмах,стек, из памяти в рекурсии

public static int sum(int x){ 
    if (x == 0 || x==1) 
    { 
     return x; 
    } 
    else 
     return x + sum(x-1); 

} 

public static double factorial(int x) 
{ 
    if (x==0 || x==1) 
    { 
     return 1; 
    } 
    else 
    { 
     return (double)(x*factorial(x-1)); 
    } 
} 

Я побежал сумму (10000) и факториал (10000), я получил ошибку переполнения стека от запуска факториала (10000), но не сумма (10 000). почему это? Не совпадает ли количество строк (вызов функции) в стеке?

+0

Возможно, потому что 10 000! на порядки больше, чем число атомов во Вселенной. –

+0

Удваиваются больше. –

+0

@musical_coder: не имеет значения. –

ответ

1

Большая разница, которую я вижу, заключается в том, что один хранит int s, другой double s на стеке.

double использует больше места (то есть, как правило .. вы не отметили вопрос на языке).

+1

На самом деле расхождение уходит, когда мы меняем возвращаемый тип 'factorial' на' int' (предполагая Java). – arshajii

+0

вещь, если я изменю тип на int ответ факториала (10 000) будет 0, потому что он превышает диапазон int – user2277918

+1

@ user2277918 Даже с двойным ответом, который вы получите, будет неправильно. 10000! приблизительно равна 2,8 * 10^35659, что находится далеко за пределами диапазона «double». – Thomas

1

Размер стека, необходимый для каждого этапа рекурсии, зависит от количества временных объектов и их типов. То же самое касается параметров и возвращенного элемента.

Как все указывает выше, две функции имеют разницу с возвращенным типом - это является причиной более быстрого потребления стека.

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