2017-06-02 46 views
1

我一直在试图制作一个图形数据结构,它可以找到凯文培根。我有一个问题,我的退货声明不起作用,我想知道这个问题可能是什么。这里是我的代码,并感谢所有帮助提前:Ruby返回语句不起作用

require_relative "Node" 

$films = [] 
$actors = [] 

def find_kevin_bacon(node, start) 
    $actors << start.name 

    if start.name == "Kevin Bacon" 
    puts "YES!" 
    return $films 
    end 

    if start.name != "Kevin Bacon" 
    puts "NO!" 

    start.film_actor_hash.each do |movie, actors| 
     if actors.include?(node) 
     puts "Its Him!" 
     $films << movie 
     find_kevin_bacon(node,node) 
     end 
    end 

    start.film_actor_hash.each do |movie, actors| 
     if $films.include?(movie) == false 

     actors.each do |act| 
      if $actors.include?(act) == false 
      $films << movie 
      find_kevin_bacon(node, act) 
      end 
     end 
     end 
    end 
    end 

    $films 
end 

我插了几手看跌语句来看看我的输出,当我运行它,我得到以下几点:

NO! 
NO! 
NO! 
NO! 
Its Him! 
YES! 
NO! 
NO! 
NO! 
NO! 
NO! 
Chappie 
X2 
Robots 
Footloose 
Robots 
X2 
Chappie 
Lion 
Bewitched 

因此,代码表示那“凯文培根”被包含在其中一个actor数组中,但不是结束它继续继续的方法。再次感谢您的帮助!

回答

1

在递归方法中,需要有一个“基本情况” - 它不会触发递归调用,而是返回一些东西。其中一种方法如下:

  1. 而不是$films,在方法结束时返回nil。实际上,这是一种信号这种迭代没有找到解决方案的方法。
  2. 在运行find_kevin_bacon(node,node)find_kevin_bacon(node,act)的地方,而不是这样做:

    result = find_kevin_bacon(node, node) # or node, act 
    return result if result 
    

    这第二行不仅将停止循环,它会从整个方法返回。

+0

我用了第二个选项,你建议它工作,所以谢谢你。我很好奇,所以我的理解是,如果返回结果如果结果是格式为返回“代码”,如果“条件”。那么,“条件”如何等于真,通常不需要比较if语句中的某些内容以获取布尔值true或false? – robert

+0

该列表不是两个选项。这两部分都是必需的。 –