[問題] 請問關於遞迴的問題(求講解)(補圖)

看板Ruby作者 (vincent)時間10年前 (2014/04/22 20:57), 10年前編輯推噓6(6024)
留言30則, 4人參與, 最新討論串1/2 (看更多)
http://imgur.com/JrrL7NU
小弟練習一個例題 這個例題的目的是計算陸地的尺寸 但不重複計算 我左看右看完全不知道他到底是如何計算的 或是為什麼在if那邊要用[y] [x] != 'land' 等等的 請問有人可以完整的幫我解釋一下嗎? 謝謝您! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.172.82.241 ※ 文章網址: http://www.ptt.cc/bbs/Ruby/M.1398171471.A.860.html

04/22 22:06, , 1F
這解法中心思想就是從某個點開始,往外8個點檢查是否為
04/22 22:06, 1F

04/22 22:07, , 2F
陸地,加起來。因為周圍8個點的周圍也可能是陸地,所以
04/22 22:07, 2F

04/22 22:07, , 3F
用遞迴的方式計算
04/22 22:07, 3F

04/22 22:09, , 4F
計算過的陸地要改掉,避免重複計算
04/22 22:09, 4F

04/23 23:54, , 5F
謝謝您的解說,請問由一個點開始計算,這個起始點是任
04/23 23:54, 5F

04/23 23:54, , 6F
意點嗎?或是左上角呢?另外若自己計算陸地有27個為
04/23 23:54, 6F

04/23 23:54, , 7F
什麼執行出來的結果是23呢?
04/23 23:54, 7F

04/24 00:26, , 8F
這method是印出傳入的5, 5那個點的陸地大小,不是全部
04/24 00:26, 8F

04/24 00:27, , 9F
中間那個陸地只有23個點沒錯
04/24 00:27, 9F
謝謝您的解釋,但我還是不太懂@@ (5,5)那個點指的是坐標嗎?或是指(1,1)~(5,5)的範圍呢? "(5,5)的陸地大小"是什麼意思呢? 這是我畫的圖 http://imgur.com/2CjkhL0
是這樣做計算嗎? 不好意思我真的不太懂他是怎麼計算的,感謝您的解答! ※ 編輯: timeregorge (1.172.84.185), 04/24/2014 11:57:06

04/24 20:21, , 10F
感覺你似乎沒有程式背景,一般程式語言中陣列的計算是
04/24 20:21, 10F

04/24 20:22, , 11F
從0開始喔,所以(5,5)的話你要數第(6,6)個位置才是
04/24 20:22, 11F

04/24 20:23, , 12F
然後就像你的圖一樣,找周圍8個點繼續計算就是了
04/24 20:23, 12F
您好,謝謝您的解答,我的確沒有程式背景,最近正在自學中,感謝您的解說! 這樣我大概知道是怎麼運作的了但另外一個問題我嘗試把綠色筐原本是陸 地改成水,以計算來說應該計數會是22因為少了一個陸地 但為什麼執行的結果卻是21呢?http://imgur.com/f4B4Uow
※ 編輯: timeregorge (1.172.84.185), 04/25/2014 13:02:23 ※ 編輯: timeregorge (1.172.84.185), 04/25/2014 13:03:44

04/25 17:26, , 13F
綠框的位置剛好連接紅框那邊的陸地和綠框上面那個陸地
04/25 17:26, 13F

04/25 17:27, , 14F
你把綠框改成水以後,兩邊就不相連了,所以計算不到
04/25 17:27, 14F
謝謝您的講解,所以只有和陸地有相連的中間沒有斷開的才會被計算到嗎? http://imgur.com/hmFJoqb
紅線範圍內是被計算到的 綠筐則是因為週邊為水所以不列入 那若是我改變坐標位置要計算右上角的3個有辦法嗎?因為我改變坐標似乎計算數會為0 此外現在的(5,5)是(x,y)或是依照 if world[y][x] != 'land' return 0 end size = 1 world[y][x] = 'counted land' 這一段裡面的設定為(y,x)呢? 謝謝您的解答! ※ 編輯: timeregorge (1.172.84.185), 04/26/2014 12:05:30

04/26 18:12, , 15F
你試試continent_size(world, 8, 2)
04/26 18:12, 15F

04/26 18:13, , 16F
world[1][2]會去找從world第二排第三個
04/26 18:13, 16F

04/26 18:13, , 17F
所以你的右上角應該是world[2][8]
04/26 18:13, 17F

04/26 18:14, , 18F
但是continent_size中是用world[y][x],所以要反過來
04/26 18:14, 18F

04/26 18:15, , 19F
上面說得不清楚,world[1][2]是找world第二橫排第三個
04/26 18:15, 19F

04/26 18:16, , 20F
基本上,你可以把第一個[]裡面的數字當作row
04/26 18:16, 20F

04/26 18:16, , 21F
第二個[]裡面的數字當作column
04/26 18:16, 21F
原來如此 不好意思再次請教,在def裡面的if 條件式 if world[y][x] != 'land' 在上面地圖中是M條件式中變成'land' 用M或用'land'都是相同意思嗎?沒什麼關係嗎? 謝謝您 ※ 編輯: timeregorge (218.164.117.176), 04/27/2014 21:29:28

04/28 20:18, , 22F
這裡的M宣告在def外面,不能用在def裡面
04/28 20:18, 22F

04/28 20:20, , 23F
詳細的原因挺難解釋的,會牽扯到class的context的問題
04/28 20:20, 23F

04/28 20:22, , 24F
Sorry,我忘記這是大寫M...,大寫的M是constant,可以用
04/28 20:22, 24F

04/28 20:22, , 25F
在def裡面沒錯
04/28 20:22, 25F

04/29 02:20, , 26F
不要管那個大小寫了...他只是想畫一個地圖而已...
04/29 02:20, 26F
mars90226:我想他要問if world[y][x] != M能不能用 04/29 09:23 我的確是想問能不能用M,但我其實是想知道為何在裡面要用'land'而不是用'M'.. 謝謝各位的解答! ※ 編輯: timeregorge (218.164.117.176), 04/29/2014 20:20:51

05/01 20:18, , 27F
為什麼這裡用'land'應該只有原作者知道,你要用M也可以
05/01 20:18, 27F

05/01 20:19, , 28F
但可能是因為這樣比較容易看得懂。
05/01 20:19, 28F

05/02 23:37, , 29F
原來如此,本來的想法應該是因為def 外部的變數和內部
05/02 23:37, 29F

05/02 23:37, , 30F
是不可共用的,但我改成M卻也是可以執行..
05/02 23:37, 30F
文章代碼(AID): #1JLcTFXW (Ruby)
文章代碼(AID): #1JLcTFXW (Ruby)