Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Scala] Problème assignement à une variable

"Reassignment to val" alors que c'est une variable.

    13 novembre 2010 à 19:12:46

    Bien le bonjour,
    mon algorithme est simple, je passe une liste nommée tab(déclarée avec un val donc équivalent à une constante) et une variable min déclarée avec var, donc variable.
    Je passe ces deux éléments comme arguments dans une fonction récursive pour trouver la valeur minimum contenu dans la liste.
    Mais lorsque je veux donner la valeur du premier terme de la liste, j'ai une erreur qui dit que je ne peux pas réaffecter la valeur de min, qui pourtant est une variable. Voici le code :
    object findMin 
    {
    	def main(args : Array[String])
    	{
    		val tab : List[Int] = List(8, 16, -4, 34, -9, 11, -87) ;
    		var min : Int = tab.head ;
    		
    		min = findMin(tab, min) ;
    		println(min) ;
    	}
    
    	def findMin(tab : List[Int], min : Int) : Int = 
    	{
    		if(tab.isEmpty)
    			min ;
    		else
    		{
    			if(tab.head < min)
    				min = tab.head ;
    			findMin(tab.tail, min) ;
    		}
    	}
    }
    


    L'erreur se situe à la ligne 19, avec la variable de la ligne 6 : "Reassignment to val". Pourtant c'est bien un var.

    Si quelqu'un à une idée ? Merci bien.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      14 novembre 2010 à 11:46:46

      Je ne connais pas Scala, donc je ne peux pas te proposer un code qui marche. En revanche, je pense que je comprends pourquoi celui-ci ne fonctionne pas : dans ta fonction findMin, tu utilises un argument nommé min que tu essayes de modifier. Ça n'est pas le même que la variable locale que tu déclares dans le main !

      Toi, ce que tu veux faire, c'est comparer tab.head (l'élément que tu es en train de regarder dans ta liste) avec ce que findMin va trouver dans tab.tail. Comme tu retournes ce minimum, tu n'as pas besoin de modifier une variable : il te suffit
      • de faire ton appel récursif pour trouver le minimum dans tab.tail
      • de le comparer avec tab.head et de renvoyer le tout


      Bien sûr, si tu ne passes pas de min en argument, ton cas de base est impossible à écrire. Tu vas devoir le modifier : ça ne sera plus la liste vide, mais une liste singleton composée d'un seul élément.
      • Partager sur Facebook
      • Partager sur Twitter
        14 novembre 2010 à 12:11:07

        Le passage des paramètres en Scala se fait par référence constante, donc les paramétres formels sont considérés comme des vals.
        Tu peux ne pas utiliser la variable min, comme l'a signalé iPoulet, mais tu peux aussi contourner le problème d'affectation très facilement sans perdre la récursivité terminale:

        if(tab.isEmpty)
        	min ;
        else if(tab.head < min)
        	findMin(tab.tail, tab.head) ;
        else	
                findMin(tab.tail, min) ;
        


        PS: pas besoin de mettre des ";" en Scala (ni les types des variables de ton "main") ;)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          14 novembre 2010 à 12:12:19

          À quand la suite de ton tutoriel Einstein++ :> ?
          • Partager sur Facebook
          • Partager sur Twitter
            14 novembre 2010 à 12:16:09

            Citation : iPoulet

            À quand la suite de ton tutoriel Einstein++ :> ?


            Je reprendrai la rédaction dans deux semaines. Je m'excuse pour cet abandon temporaire du tutoriel :honte:
            • Partager sur Facebook
            • Partager sur Twitter
              14 novembre 2010 à 15:54:25

              if(tab.isEmpty)
                  min
              else
                  findMin(tab.tail, if(tab.head < min) tab.head else min)
              

              ?

              Note : j’imagine que tu as écrit ce code pour t’entraîner ; mais, juste au cas où, les listes de Scala disposent désormais d’une méthode “min” :
              scala> List(5, -3, 6) min
              res0: Int = -3
              
              • Partager sur Facebook
              • Partager sur Twitter

              [Scala] Problème assignement à une variable

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown