[問題] 二維陣列的處理

看板Perl作者 (新竹到台北的共乘)時間19年前 (2005/12/03 22:43), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
請教各位高手, 假設我有一個如下所示的陣列 : (用來模擬一個 2D array) @tb = ( [1.2, 2.3, 3.4, 4.5, 5.6], \ [2.2, 3.3, 4.4, 5.5, 6.6], \ [3.2, 4.3, 6.4, 4.5, 7.6], \ [4.2, 6.3, 5.4, 5.8, 8.6], \ [5.2, 5.3, 4.4, 6.5, 9.6] ); 我想檢查在垂直方向的值, 是否都是單調 "遞增" ? 假如發現造成遞減的值, 則要進一步確認, 整個趨勢是否 "自此開始遞減" ? 也就是說, 垂直方向不能出現, "遞增, 遞減, 然後又遞增, 然後又..." 的趨勢 以上面的 table 作為例子 第一個 column 符合檢查條件 (1.2 < 2.2 < 3.2 < 4.2 < 5.2) 第二個 column 也符合, 儘管最後兩個值 (6.3 > 5.3) 是遞減, 但不違反原則 第三個 column 也符合, 因為整個趨勢自 6.4 開始遞減 第四個 column 則不符合, 因為整個趨勢先遞增, 再遞減, 而後又遞增.... ======================================================================= 我寫了一段 code 來檢查垂直方向的遞增, 如下 sub check_increasing { my ($tb_ref) = @_ ; # 從外面傳進來的 ref of @tb my $max = -16384; # initial my $err = 0; # return value for my $x (0..$#{$tb_ref}) { for my $y (0..$#{$tb_ref}->[$x]) { my $value = $tb_ref->[$y]->[$x]; $max = $value if ($value > $max); if ($y >= 1) { if ($value < $max) { print "Find non-increasing $value at $y, $x \n"; $err = ($err || 1); } } } $max = -16384; # reset } return $err; } ======================================================================= 而我的問題是, 要怎麼利用上面的架構, 進一步檢查遞增, 遞減, 又遞增的錯誤? 因為對 perl 還半生不熟, 想請各位高手指點一下, 看看是否有比較好的做法? (因為我覺得上面的寫法也不漂亮) 先謝謝各位:) -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.168.155.152
文章代碼(AID): #13aQxy9L (Perl)
文章代碼(AID): #13aQxy9L (Perl)