Отправим число из командной строки в переменную $a
.
Стягивающиеся отрезки в программе можно задать при помощи двух числовых
переменных — $left
и $right
. Ещё
пригодится переменная $mid
для середины отрезка. Но,
поскольку в деле участвуют Черепаха и Заяц, мы объявим два комплекта
переменных — черепаший и заячий. Это будут переменные
$tleft
, $tright
, $tmid
и $hleft
, $hright
,
$hmid
:
Perlmy $a=shift; my $tleft=my $hleft=0; my $tright=my $hright=(1+$a)/2; my ($tmid, $hmid);
Левые границы черепашьего и заячьего отрезка инициализируются нулями, а правые — числом, заведомо большим, чем квадратный корень.
Завершает программу цикл, завершающийся при совпадении середин черепашьего и заячьего отрезков, и команда вывода этих совпадающих значений:
Perlwhile() { $tmid=($tleft+$tright)/2; ($tmid**2<$a? $tleft: $tright)=$tmid; for(0, 1) { $hmid=($hleft+$hright)/2; ($hmid**2<$a? $hleft: $hright)=$hmid; } last if $tmid==$hmid; } print "$tmid\n";
Внутри цикла совершаются шаги половинного деления: для Черепахи одиночный,
а для Зайца — двойной (для чего применяется вложенный цикл for(0, 1)
двукратного действия). Обратите внимание на
необычное использование оператора выбора ?: в левой части
присваивания. Это лаконичная альтернатива следующего кода:
Perlif($tmid**2<$a) { $tleft=$tmid; } else { $tright=$tmid; }
Обе реализации метода Ньютона, с использованием метода Флойда и без него, оказываются совсем простыми. Мы сразу отсылаем читателя к текстам готовых программ в разделе «Метод Ньютона».