Я не думаю, что вы хотите рекурсии.Я думаю, что вы просто хотите зациклить количество циклов выплат, которые вы после.Похоже, что вы почему-то все перепутали с массивами.
print <<'HERE';
A stock xyz's price is now $100. It has 6.78% dividend.
You have 1000 of it and reinvest the dividend into the stock.
HERE
my $shares = 1000;
my $price = 100;
my $dividend = 6.78 / 100;
my $cycles = $ARGV[0] || 20;
foreach ( 1 .. $cycles ) {
local $cycle = $_;
local $payout = $shares * $dividend * $price;
local $new_shares = $payout / $price;
write();
$shares += $new_shares;
}
format STDOUT =
@### @####.###### @#####.####### @##.###### @####.######
$cycle, $shares, $payout, $new_shares, $shares+$new_shares,
.
format STDOUT_TOP =
@##.####%
$dividend
Cycle Shares Payout New Shares Total Shares
----------------------------------------------------------------
.
Это дает мне вывод:
A stock xyz's price is now $100. It has 6.78% dividend.
You have 1000 of it and reinvest the dividend into the stock.
0.0678%
Cycle Shares Payout New Shares Total Shares
----------------------------------------------------------------
1 1000.000000 6780.0000000 67.800000 1067.800000
2 1067.800000 7239.6840000 72.396840 1140.196840
3 1140.196840 7730.5345752 77.305346 1217.502186
4 1217.502186 8254.6648194 82.546648 1300.048834
5 1300.048834 8814.3310942 88.143311 1388.192145
6 1388.192145 9411.9427423 94.119427 1482.311572
7 1482.311572 10050.0724603 100.500725 1582.812297
8 1582.812297 10731.4673731 107.314674 1690.126971
9 1690.126971 11459.0608610 114.590609 1804.717579
10 1804.717579 12235.9851873 122.359852 1927.077431
11 1927.077431 13065.5849830 130.655850 2057.733281
12 2057.733281 13951.4316449 139.514316 2197.247597
13 2197.247597 14897.3387104 148.973387 2346.220985
14 2346.220985 15907.3782750 159.073783 2505.294767
15 2505.294767 16985.8985220 169.858985 2675.153752
16 2675.153752 18137.5424418 181.375424 2856.529177
17 2856.529177 19367.2678194 193.672678 3050.201855
18 3050.201855 20680.3685775 206.803686 3257.005541
19 3257.005541 22082.4975671 220.824976 3477.830517
20 3477.830517 23579.6909021 235.796909 3713.627426
Не беспокойтесь о моем использовании формат ;Я думал об этом в эти выходные, так как я переписал кое-что о Perlfaq, а затем превратил его в Использование форматов для создания постраничных текстовых отчетов .Вы также можете легко создать вывод с помощью printf :
print <<'HERE';
A stock xyz's price is now $100. It has 6.78% dividend.
You have 1000 of it and reinvest the dividend into the stock.
Cycle Shares Payout New Shares Total Shares
----------------------------------------------------------------
HERE
my $shares = 1000;
my $price = 100;
my $dividend = 6.78 / 100;
my $cycles = $ARGV[0] || 20;
foreach ( 1 .. $cycles ) {
my $payout = $shares * $dividend * $price;
my $new_shares = $payout / $price;
printf "%4d %12.6f %12.6f %10.6f %12.6f\n",
$_, $shares, $payout, $new_shares, $shares + $new_shares;
$shares += $new_shares;
}
В качестве дополнительного примечания, вы действительно никогда не захотите рекурсию, и особенно в Perl, если вы можете помочь,Другие языки обходятся без него, потому что они знают, как развернуть вашу рекурсию, чтобы превратить ее в итеративный процесс.Perl, будучи динамическим языком, на самом деле не может этого сделать, потому что не знает, будет ли подпрограмма иметь такое же определение на следующем этапе.Это хорошо как тема информатики, потому что это делает программирование немного легче, и они знают, что все это работает в конце.Я думаю, что я говорю об этом где-то в Мастеринг Perl , но Марк Джейсон Доминус подробно описывает это в Perl высшего порядка .По сути, вместо рекурсии вы используете очередь, которая в любом случае лучше практиковать.