0 votes

ruby boucle récursive échoue

asdf = [[1,2,3],[11,22,33,44,55,66],[51]]

def recursive(params, index)
 if (index==params.size)
  puts "DONE"
 end

 currentParam = params[index]
 currentParam.each do |sh|
  puts sh
  recursive(params, index+1)
 end

end

recursive(asdf,0)

Je m'attendais à une sortie comme :

1 11 22 33 44 55 66 51 2 11 22 33 44 55 66 51 3 11 22 33 44 55 66

Au lieu de cela, j'obtiens :

1 11 51

Et :

Méthode 'each' non définie pour nil:NilClass`.

3voto

Kevin Ballard Points 88866

Le premier problème que je vois est que la méthode recursive n'est pas vraiment récursif. Je suppose que l'appel à traverse était destiné à être la récursion.

Le deuxième problème est lorsque index == params.size vous n'arrêtez pas réellement la récursion. Vous imprimez simplement "DONE" et vous continuez. Ceci explique l'exception nil.

Le troisième problème est que ce modèle ne correspond pas à vos attentes de toute façon. Etes-vous sûr que vous vouliez que ce soit 1 11 22 33 44 55 66 51 2 11 ... et non 1 11 51 22 51 33 51 44 51 55 51 66 51 2 11 51 22 51 ... ? C'est ce que votre code tente de faire, et c'est en fait ce que vous obtenez si vous remplacez la balise puts "DONE" avec return .

Voici une façon un peu plus élégante d'écrire votre méthode :

def recursive2(params)
  return if params.empty?
  params[0].each do |p|
    puts p
    recursive2(params[1..-1])
  end
end

recursive2(asdf)

0voto

Ed S. Points 70246

Vous avez un tableau de tableaux

asdf = [[1,2,3],[11,22,33,44,55,66],[51]]

Le tableau asdf contient trois éléments, chacun étant un tableau. Ainsi, lorsque vous indexez dans params avec un index de 3 ou plus, vous obtenez nil. Au minimum, vous devrez parcourir chaque sous tableau également dans votre boucle externe. Ou alors, vous pouvez les compacter en un seul tableau.

De plus, comme je l'ai noté dans un commentaire, votre routine n'est pas du tout récursive. Vous avez une méthode 'recursive' qui appelle une autre méthode 'traverse' à l'intérieur d'une boucle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X