设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2285|回复: 5
打印 上一主题 下一主题

[已经解决] 请问:在方法里面使用同名的方法,怎么写?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3970
在线时间
254 小时
注册时间
2013-10-13
帖子
794
跳转到指定楼层
1
发表于 2020-8-11 15:20:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
在Game_Battler类中,有一段代码,内容如下:
        if $data_states[state_id].plus_state_set.include?(i)
          add_state(i)
        end
在这里,怎么能用方法add_state(i)呢?这个不是本类的方法吗?我构思了一下,
为什么我下面的程序就不能把aa(x)加进方法aa中呢?
class A
  def aa(x, y=nil)
    @a=x
    aa(x)
    @b=x
  end
end
a=A.new
a.aa(1)
p  a
因此,我想问:为什么在方法add_state(state_id, force=false)中,可以在内部再次使用
方法add_state(i)?

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21015
在线时间
9338 小时
注册时间
2012-6-19
帖子
7107

开拓者短篇九导演组冠军

2
发表于 2020-8-11 16:36:19 | 只看该作者
不是啊老哥你这不是写了个死循环吗

评分

参与人数 1星屑 +20 收起 理由
RyanBern + 20 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
2
星屑
6639
在线时间
501 小时
注册时间
2018-3-23
帖子
533

R考场第七期银奖

3
发表于 2020-8-11 16:45:57 | 只看该作者
(以下部分大部分为废话)
递归。
递归是函数方面的一个基本概念,也就是函数自己调用自己。
首先,要考虑到的一件事是,自己调用自己的函数如果没有任何“边界条件”,也就是决定递归终止的条件,那么就会产生死循环。
但是如果递归在某一层会终止并且一层一层返回,最终就可以得到答案。
例如斐波那契数列的递归/递推式可以表达为f(n)=f(n-1)+f(n-2),边界条件为f(1)=1,f(2)=1。结果将是1,1,2,3,5,8,13,21,34,55……这样的一个数列。如果我们要求某一项例如f(5),结果就是这个数列的第五项,也就是5。
所以递归是数学上的一个重要方法,在算法设计上也有重要意义。
(正文)
这里使用这种方法,原因就是因为这里有一个至关重要的unless state?(state_id),在Game_Battler 2的第59行。
这段代码意味着,一个已经被附加的状态不会再被进行任何重复附加的处理。
也就是说,如果一个状态被设置成连带附加其它状态(数据库-状态页面右侧),那么如果这些状态没有更进一步连带附加的状态,那么附加完就自然结束,不会继续递归,正常返回。
如果有进一步附加的状态,就会继续附加这些状态,这可能又会导致更多状态被连带附加……以此类推。
但是,由于一个已经被附加的状态不会重复进行连带附加的操作,所以上述操作一定是会终止的。例如A连带B,B连带A,但是由于连带时A已经被附加,所以不会继续进行附加,正常终止。
退一万步讲,这段代码如果由一个状态的附加附加了全数据库的状态,但这也就是极限了,之后肯定会正常终止。
所以,不产生死循环的递归是一种十分有用的算法设计思想。设计算法的时候也不要盲目使用递归,只有在递归是有限时间,并且可以简化算法思维难度的时候,再使用递归。

评分

参与人数 1星屑 +70 +1 收起 理由
RyanBern + 70 + 1 认可答案

查看全部评分

祝好。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
24444
在线时间
5072 小时
注册时间
2016-3-8
帖子
1623
4
发表于 2020-8-11 17:26:10 | 只看该作者
啊这。。
怎么VA的大神们都跑去XP区回答高端大气上档次的问题了。。
叫VA的弱弱们情何而堪。。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
2
星屑
13088
在线时间
2273 小时
注册时间
2011-6-4
帖子
613
5
发表于 2020-8-11 17:35:15 | 只看该作者
本帖最后由 真·可乐 于 2020-8-11 17:36 编辑

运行如下代码
  1. class A
  2.   def aa(x, y=nil)
  3.     @a=x
  4.     aa(x)
  5.     @b=x
  6.   end
  7. end
  8. a=A.new
  9. a.aa(1)
  10. p a
复制代码
报错了


稍作修改一下,每次调用函数aa,@count就+1;即用@count来计数,看到报错之前,函数aa调用了多少次
  1. class A
  2.   attr_reader        :count
  3.   
  4.   def aa(x, y=nil)
  5.     @count ||= 0
  6.     @count += 1
  7.     @a=x
  8.     aa(x)
  9.     @b=x
  10.   end
  11. end
  12. a=A.new

  13. begin
  14.   a.aa(1)
  15. rescue
  16.   p a.count
  17. end
复制代码
函数总共调用了1365次


再试试这样,函数被调用1337(小于1365)次的时候停下来
  1. class A
  2.   attr_reader        :count
  3.   
  4.   def aa(x, y=nil)
  5.     @count ||= 0
  6.     @count += 1
  7.     @a=x
  8.     return if @count == 1337
  9.     aa(x)
  10.     @b=x
  11.   end
  12. end
  13. a=A.new
  14. a.aa(1)
  15. p a
复制代码
没报错了



总之就是,递归调用可以,但是不能像楼主这样无限递归


点评

谢谢!  发表于 2020-8-14 15:19

评分

参与人数 1星屑 +70 +1 收起 理由
RyanBern + 70 + 1 认可答案

查看全部评分

BUG反馈请加QQ 529283039
水友群 917854767

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-11 01:51

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表