Linux Shell Scripting рекурсивное экспонирование - PullRequest
0 голосов
/ 11 ноября 2018

Я пишу сценарий, который принимает 2 числа в качестве входных данных и использует рекурсию для включения числа в силу другого простого возведения в степень. Однако я новичок в написании сценариев и не могу понять, где мой синтаксис здесь ошибочен.

Вот сценарий

#!/bin/bash
echo "Enter number: "
read number
echo "Enter power: "
read power

echo "Powering $number to power of $power!" 

exp () {

    if [ $2 = 1 ]
    then
        return $1
    fi

    return $1 * $(exp $1 $2-1 )

}

result=$(exp $number, $power)

echo "Result: $result"

В настоящее время он как бы зависает, я не уверен, правильно ли я использую параметры (с точки зрения синтаксиса).

1 Ответ

0 голосов
/ 11 ноября 2018

Вам нужно $(( )), чтобы форсировать арифметическую оценку. Тогда вы можете сделать это с помощью возвращаемых значений:

number=2 power=7
exp () {
    if [ $2 -eq 1 ]; then return $1; fi
    exp $1 $(($2-1))
    return $(($1 * $?))
}
exp $number $power; result=$?
echo "Result: $result"

но это плохая идея, потому что оболочка вроде возвращает ненулевые возвращаемые значения для сообщения об ошибке (например, вышеупомянутое решение «сломается» set -e).

Идиоматически, вы можете использовать стандартный вывод:

set -e
number=2 power=7
exp () {
    if [ $2 -eq 1 ]; then echo $1; return; fi
    echo $(($1 * $(exp $1 $(($2-1)) ) ))
}
result=$(exp $number $power)
echo "Result: $result"

но это неэффективно со всеми подоболочками. Лучше всего избегать рекурсии и просто зацикливаться:

number=2 power=7
exp () {
    local res=1 i=0;
    while [ $i -lt $2 ]; do res=$((res*$1)); i=$((i+1)); done
    echo $res
}
exp $number $power
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...