Если вы понимаете, как вызов функции влияет на стек процессов, вы можете понять, как сделать это самостоятельно.
Когда вы вызываете функцию, в стек записываются некоторые данные, включая аргументы.Функция читает эти аргументы, делает с ними что угодно и помещает результат в стек.Вы можете сделать то же самое.Ваш пример, в частности, не нуждается в стеке, поэтому, если я преобразую его в тот, который использует стек, он может выглядеть немного глупо, поэтому я приведу вам пример Фибоначчи:
fib(n)
if n < 2 return n
return fib(n-1) + fib(n-2)
function fib(n, i)
stack.empty()
stack.push(<is_arg, n>)
while (!stack.size() > 2 || stack.top().is_arg)
<isarg, argn> = stack.pop()
if (isarg)
if (argn < 2)
stack.push(<is_result, argn>)
else
stack.push(<is_arg, argn-1>)
stack.push(<is_arg, argn-2>)
else
<isarg_prev, argn_prev> = stack.pop()
if (isarg_prev)
stack.push(<is_result, argn>)
stack.push(<is_arg, argn_prev>)
else
stack.push(<is_result, argn+argn_prev>)
return stack.top().argn
Объяснение:каждый раз, когда вы берете предмет из стека, вам нужно проверить, нужно ли его расширять или нет.Если это так, поместите соответствующие аргументы в стек, если нет, дайте ему слиться с предыдущими результатами.В случае Фибоначчи, когда вычисляется fib(n-2)
(и он доступен в верхней части стека), извлекается n-1
(один за вершиной стека), под ним ставится результат fib(n-2)
, а затем fib(n-1)
расширяется и вычисляется.Если два верхних элемента стека были оба результата, конечно, вы просто добавляете их и перемещаете в стек.
Если вы хотите посмотреть, как будет выглядеть ваша собственная функция, вот она:
function f(n, i)
stack.empty()
stack.push(n)
stack.push(i)
while (!stack.is_empty())
argi = stack.pop()
argn = stack.pop()
if argn <= argi
result = argn
else if n % i = 0
stack.push(n / i)
stack.push(i)
else
stack.push(n)
stack.push(i + 1)
return result