2010-08-23 94 views
-2

我正試圖編寫一個計算股票股利的程序。我沒有一個子程序就做了這個。現在,我試圖修改它,以便它可以使用遞歸例程運行。任何幫助?因爲我不擅長這個。Perl遞歸幫助

這是原始腳本+可悲的嘗試。

print "A stock xyz's price is now $100. It has 3.78% dividend. You have 1000 of it and reinvest the dividend into the stock.\n"; 

my %hash; 
@stocknum = 1000; 
@dividend = 6780; 

while ($#dividend != 20) { 
    $a = $dividend[-1]; 
    $stock = $stocknum[-1]; 
    $div_total= $stock*100*0.0678; 

    $stock_total = $stock + int($a/100); 
    push (@stocknum, $stock_total); 
    push (@dividend, $div_total); 

    if ($#dividend == 20) { 
     last; 
    } 
} 

shift (@dividend); 
$stock_num = $stocknum[-1]; 
$div = $stock_num*100*0.0678; 
push (@dividend, $div); 
@hash{@stocknum} = @dividend; 

foreach $key(sort keys %hash) { 
    print "Stock number: $key\t"."Dividend: $hash{$key}\n"; 
} 

$dividend=0.0378; 
+0

這是功課嗎?你有你想寫的子程序的例子嗎? – 2010-08-23 20:17:52

+0

這功課嗎? – Zaid 2010-08-23 20:17:58

+0

你的分利率是6.78%,而不是3.78%,對不對?並不重要,但請編輯以保持一致。你的目標是什麼?這個#div <= 20來自哪裏? – Zhang18 2010-08-23 20:18:03

回答

5

我不認爲你想要遞歸。我想你只是想循環你之後的支出週期數。由於某種原因,你看起來像是混淆了數組。

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中有廣泛的報道。基本上,而不是遞歸你使用隊列,這是一個更好的技能來練習。