2017-06-02 45 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

該列表不是兩個選項。這兩部分都是必需的。 –