作者timeregorge (vincent)
看板Ruby
标题[问题] 请问关於递回的问题(求讲解)
时间Tue Apr 22 20:57:48 2014
http://imgur.com/JrrL7NU
小弟练习一个例题
这个例题的目的是计算陆地的尺寸
但不重复计算
我左看右看完全不知道他到底是如何计算的
或是为什麽在if那边要用[y] [x] != 'land'
等等的
请问有人可以完整的帮我解释一下吗?
谢谢您!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.172.82.241
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Ruby/M.1398171471.A.860.html
1F:→ mars90226:这解法中心思想就是从某个点开始,往外8个点检查是否为 04/22 22:06
2F:→ mars90226:陆地,加起来。因为周围8个点的周围也可能是陆地,所以 04/22 22:07
3F:→ mars90226:用递回的方式计算 04/22 22:07
4F:→ mars90226:计算过的陆地要改掉,避免重复计算 04/22 22:09
5F:→ timeregorge:谢谢您的解说,请问由一个点开始计算,这个起始点是任 04/23 23:54
6F:→ timeregorge:意点吗?或是左上角呢?另外若自己计算陆地有27个为 04/23 23:54
7F:→ timeregorge:什麽执行出来的结果是23呢? 04/23 23:54
8F:推 mars90226:这method是印出传入的5, 5那个点的陆地大小,不是全部 04/24 00:26
9F:→ mars90226:中间那个陆地只有23个点没错 04/24 00:27
谢谢您的解释,但我还是不太懂@@
(5,5)那个点指的是坐标吗?或是指(1,1)~(5,5)的范围呢?
"(5,5)的陆地大小"是什麽意思呢?
这是我画的图
http://imgur.com/2CjkhL0
是这样做计算吗?
不好意思我真的不太懂他是怎麽计算的,感谢您的解答!
※ 编辑: timeregorge (1.172.84.185), 04/24/2014 11:57:06
10F:推 mars90226:感觉你似乎没有程式背景,一般程式语言中阵列的计算是 04/24 20:21
11F:→ mars90226:从0开始喔,所以(5,5)的话你要数第(6,6)个位置才是 04/24 20:22
12F:→ mars90226:然後就像你的图一样,找周围8个点继续计算就是了 04/24 20:23
您好,谢谢您的解答,我的确没有程式背景,最近正在自学中,感谢您的解说!
这样我大概知道是怎麽运作的了但另外一个问题我尝试把绿色筐原本是陆
地改成水,以计算来说应该计数会是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
13F:推 mars90226:绿框的位置刚好连接红框那边的陆地和绿框上面那个陆地 04/25 17:26
14F:→ mars90226:你把绿框改成水以後,两边就不相连了,所以计算不到 04/25 17:27
谢谢您的讲解,所以只有和陆地有相连的中间没有断开的才会被计算到吗?
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
15F:推 mars90226:你试试continent_size(world, 8, 2) 04/26 18:12
16F:→ mars90226:world[1][2]会去找从world第二排第三个 04/26 18:13
17F:→ mars90226:所以你的右上角应该是world[2][8] 04/26 18:13
18F:→ mars90226:但是continent_size中是用world[y][x],所以要反过来 04/26 18:14
19F:→ mars90226:上面说得不清楚,world[1][2]是找world第二横排第三个 04/26 18:15
20F:→ mars90226:基本上,你可以把第一个[]里面的数字当作row 04/26 18:16
21F:→ mars90226:第二个[]里面的数字当作column 04/26 18:16
原来如此
不好意思再次请教,在def里面的if 条件式
if world[y][x] != 'land'
在上面地图中是M条件式中变成'land'
用M或用'land'都是相同意思吗?没什麽关系吗?
谢谢您
※ 编辑: timeregorge (218.164.117.176), 04/27/2014 21:29:28
22F:推 mars90226:这里的M宣告在def外面,不能用在def里面 04/28 20:18
23F:→ mars90226:详细的原因挺难解释的,会牵扯到class的context的问题 04/28 20:20
24F:→ mars90226:Sorry,我忘记这是大写M...,大写的M是constant,可以用 04/28 20:22
25F:→ mars90226:在def里面没错 04/28 20:22
26F:→ hSATAC:不要管那个大小写了...他只是想画一个地图而已... 04/29 02:20
→ mars90226:我想他要问if world[y][x] != M能不能用
04/29 09:23
我的确是想问能不能用M,但我其实是想知道为何在里面要用'land'而不是用'M'..
谢谢各位的解答!
※ 编辑: timeregorge (218.164.117.176), 04/29/2014 20:20:51
27F:推 rexkimta:为什麽这里用'land'应该只有原作者知道,你要用M也可以 05/01 20:18
28F:→ rexkimta:但可能是因为这样比较容易看得懂。 05/01 20:19
29F:→ timeregorge:原来如此,本来的想法应该是因为def 外部的变数和内部 05/02 23:37
30F:→ timeregorge:是不可共用的,但我改成M却也是可以执行.. 05/02 23:37