Оболочки поддерживают рекурсию?

Этот вид проблемы является подходящим к awk:

% awk '/\.1987:/ {gsub(/,.*/, ""); print}' students.txt 
Taylor
Sellen

Или, указывая столбец, а не целую строку (помогающий Вам для настройки, должен Вы хотеть включить другие столбцы:

% awk '/\.1987:/ {
        gsub(/,$/, "", $1);          
        print $1;
}' students.txt
Taylor
Sellen
1
20.08.2012, 18:49
2 ответа
  • Синтаксическая ошибка: не используйте кавычки в арифметической оценке.
  • Логическая ошибка: Вы смешиваете STDOUT и return значения.

Любая передача оценивает как STDOUT:

function factorial {
    (( $1 )) &&
    echo $(( $1 * $( factorial $(( $1 - 1 )) ) )) ||
    echo 1
}

factorial 5

Или return их:

function factorial {
    (( $1 )) || return 1
    factorial $(( $1 - 1 ))
    return $(( $1 * $? ))
}

factorial 5
echo $?

Оба кода работают в bash, ksh (93 верных, никакая идея приблизительно 88) и zsh, таким образом, я предполагаю да, оболочки действительно поддерживают рекурсию.

8
27.01.2020, 23:12
  • 1
    Это продолжило работать ksh88 –  rahmu 22.08.2012, 18:22
  • 2
    Вы действительно не хотите return численные значения, которые могли быть выше, чем 255. Используйте STDOUT. –  l0b0 03.09.2012, 14:18

Рекурсия - это не зло; до тех пор, пока вы знаете, что происходит внутри, когда вы вызываете функцию, и подводные камни.

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

Затем переменные и точки входа. Каждый вызов функции помещает информацию в стек; адрес точки повторного входа (адрес следующей инструкции при возврате функции). Затем вам нужно зарезервировать место для типа возвращаемого значения tge.

Далее следует вопрос объема. Переменные передаются как параметры, а локальные переменные объявлены в функции. Каждый раз, когда вызывается функция, это пространство должно выделяться в стеке и удерживаться там до тех пор, пока оно не будет вытеснено путем возврата к вызывающей функции. Итак, в конечном итоге у вас закончится память стека (условие переполнения стека).

Я написал программу «Ханойские башни» для класса паскаль, который преподавался на DEC Vax. Я попытался создать условие, которое приведет к сбою моей программы или VMS, если я смогу добавить столько полюсов и столько колец, сколько я хотел. Я получил 1000 колец на 3 полюса, а программа все еще работала. На пробежку ушло минут 10, но я побежал.

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

0
27.01.2020, 23:12

Теги

Похожие вопросы