Рекурсивная функция, которая вызывает себя n раз без использования n в качестве параметра - PullRequest
1 голос
/ 10 декабря 2010

Предположим, у меня есть myFunction ($ var). Он будет манипулировать $ var, вызывая себя 3 раза, прежде чем, наконец, вернуть $ var. Есть ли способ сделать это без сохранения количества вызовов в параметрах?

Ответы [ 6 ]

2 голосов
/ 10 декабря 2010

Один из способов сделать это - сделать n необязательным и по умолчанию 3, если не определено.Я не знаю синтаксиса PHP для этого, но так как он помечен как независимый от языка, вот эквивалент javascript:

function myFunction (var, n) {
    if (n == undefined) {
        n = 3;
    }

    doSomethingWith(var);

    n--;

    if (n) {
        myFunction(var, n);
    }
}

// called like this:
myFunction(someVar);
2 голосов
/ 10 декабря 2010

Два конкурирующих метода на моей голове:

  1. статические глобальные данные
  2. преобразуют $ var таким образом, что вы можете определить, сколько раз им манипулировали
1 голос
/ 10 декабря 2010

Вы можете использовать статический оператор, чтобы установить переменную var и проверять ее значение при каждом входе (увеличивая его каждый раз, конечно, при вводе, уменьшая при выходе).Вот статья об основной концепции.http://www.bellaonline.com/articles/art29070.asp

Соответствующий код

 function count_calls( )
{
static $no_calls = 0;
$no_calls++;
echo "This function has been called $no_calls times.";
}
0 голосов
/ 21 декабря 2010

Если вы знаете, что ваша функция будет вызывать себя точно три раза, четыре за время , которое вы вызвали, лучше создать более простую нерекурсивную функцию и сделать вызов явным:

simpleF(simpleF(simpleF(simpleF($var))))

Менее элегантно, но более легко обслуживаемо.

Конечно, это не будет масштабироваться для большего числа.

0 голосов
/ 10 декабря 2010

Некоторые функциональные языки поддерживают этот вид конструкции.

В Mathematica, например, вы можете определить:

     f[i_, n_: 3] := Nest[# + 7 &, i, n];  

Где 3 - значение по умолчанию для n.

Итак

     f[2]  

Возвращает

     23  -> (2+7+7+7)

и

     f[4,1]  

Возвращает

     11 (-> 4+7)

Конечно, вы также можете определить

     f[i_] := Nest[# + 7 &, i, 3];  

если вам не нужно настраивать количество рекурсивных вызовов.


Возможно, это более интересно. Вы также можете запросить все промежуточные результаты.

Итак, если вы определите:

g[i_, n_: 3] := NestList[# + 7 &, i, n];  

тогда

g[2] Returns {2, 9, 16, 23}  
0 голосов
/ 10 декабря 2010

Вы не говорите, что происходит после рекурсивных вызовов, поэтому…

setrlimit(RLIMIT_STACK) для небольшого значения и / или занимает достаточно места в стеке для других вызовов, myFunction()может выполнить повтор только 3 раза перед прерыванием из-за недостатка места в стеке.

...