2012-04-03 2 views
1

Пожалуйста, помогите мне понять эту рекурсивную функцию ...рекурсивные функции в JavaScript

var stack = Array; 
function power(base, exponent){ 
    if (exponent === 0) { 
     return 1; 
    } else { 
     stack[exponent-1] = base * power(base, exponent - 1); 
     return stack[exponent-1]; 
    } 
} 

Я не понимаю, что

stack[exponent-1]
делает

+1

кратчайший был бы "base^exponent" :) –

+0

(Для комментариев выше: на самом деле '^' является исключительным или, а не властью.) – iamnotmaynard

ответ

1

Я консольный лог стека [показатель-1] с помощью

var stack = Array; 
function power(base, exponent){ 
    if (exponent === 0) { 
     return 1; 
    } else { 
     stack[exponent-1] = base * power(base, exponent - 1); 
     console.log(stack[exponent-1]);return stack[exponent-1]; 
    } 
} 

O/P:

power(2,5) 
2 
4 
8 
16 
32 

Так функция класса рекурсивно до показателя не станет 0 (п-й вызов), то он будет начать возвращать результаты

first it will return 1  (because exponent is 0) 
     then returns 2 * 1 (return of n call) 
       then 2 * 2 (return of n-1 call) 
       then 2 * 4 (return of n-2 call) and so on 
+0

Ой, так что он бежит полностью, а затем возвращается. Мне было интересно, как это было бы правильно, просто продолжал возвращаться! Большое спасибо – Sam

+0

, когда вы вызываете функцию 1 и функцию 1 вызывает функцию 2 и функцию 2, называемую функцией 3, ответ будет первым из функции 3, затем функция 2, затем функция 1, ее стек http://en.wikipedia.org/ wiki/Stack_ (data_structure) –

2

Какой? Это называется дважды. Но каждый раз он либо получает значение, которое существует в массиве, при индексе, равном текущему значению exponent-1, либо устанавливая это значение.

Это просто индекс массива и доступ.

+0

Оба, можете ли вы объяснить визуально, пожалуйста? С примером кода – Sam

+0

@Sam Huh? Объясните, как получить доступ к значениям, являющимся членами массива? Это все, что он делает. Скажем, 'exponent = 5', так что вызов переводится в' stack [4] ', обращаясь к пятому элементу массива (индексы массива начинаются с 0). [Документация Mozilla для массива] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array). Они оба идентичны по своей природе, только одна из них устанавливает значение (одно с =), и одно из них получает значение. – tkone

1

Алгоритм укладки результат каждой мощности от исходного показателя до 0.

При запуске power(2, 3), стек будет, в какой-то момент, могут быть:

stack[2] = 8 
stack[1] = 4 
stack[0] = 2 

Это действительно не имеет ничего общего с математической концепцией власти.

+1

Я думаю, что было бы наоборот. стек [0] равен 2, а стек [2] равен 8. –

+0

Да, это было мое плохое, просто отредактированное. Благодарю. –

+0

Как вернуть всех из них сразу? Это часть, сбивающая меня с толку, чтобы сделать массив стека завершенным. – Sam

1

взгляните на эту версию!

function pow(x,n) 
{ 
    return n==0?1:n==1?x:n==2?x*x:pow(pow(x,(n-n%2)/2),2)*(n%2==0?1:x); 
} 

может быть короче?

+0

Это ответ или вопрос? Если это вопрос, отправьте его как таковой. Если это ответ, я не вижу, как он отвечает на вопрос. Возможно, вы могли бы поставить вопрос на [codereview.se] или [codegolf.se] (как вызов). –

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