我不認爲你想要遞歸。我想你只是想循環你之後的支出週期數。由於某種原因,你看起來像是混淆了數組。
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
不要擔心我使用的format;這個週末我在大腦中已經有了,因爲我重寫了一些關於它的perlfaq的東西,然後把它變成了Use formats to create paginated, plaintext reports。你可以很容易地創建的輸出與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,但是Mark Jason Dominus在高階Perl中有廣泛的報道。基本上,而不是遞歸你使用隊列,這是一個更好的技能來練習。
這是功課嗎?你有你想寫的子程序的例子嗎? – 2010-08-23 20:17:52
這功課嗎? – Zaid 2010-08-23 20:17:58
你的分利率是6.78%,而不是3.78%,對不對?並不重要,但請編輯以保持一致。你的目標是什麼?這個#div <= 20來自哪裏? – Zhang18 2010-08-23 20:18:03