2016-01-06 1 views
0

Je suis en difficulté sur un projet de collège.Le projet doit être fait en utilisant C# comme un langage de programmation et fait sous Windows Form comme. Le programme s'exécute. Je sais qu'il a des défauts mais au moins je veux savoir comment obtenir de cette erreur: http://postimg.org/image/gwuzmyc73/. Pour le problème, j'ai besoin de plier un vecteur en utilisant le Divide et Impera. J'ai besoin d'insérer un nombre à partir du clavier n, le vecteur généré serait comme a = (1,2,3,4,5,6,7) et les éléments finaux sont 1,3,5,7. Le problème ressemble à: Un vecteur de n éléments.Nous définissons son pliage en chevauchant les 2 demi, si n est impair.Les 2 demi sont repliés jusqu'à ce que de subvector atteigne 1 élément.Utiliser Divide et Impera.Vecteur se pliant en utilisant Divide et Impera dans C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 


namespace Plierea_Vectorilor 
{ 
public partial class Form1 : Form 
{ 
    public int n; 
    public int i; 
    public int[] efinal = new int[50]; 
    public string m = new string(new char[50]); 
    public int Ls, Ld; 
    public char[] aux = new char[50]; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void Pliaza(int p,int q) 
    { 
     if (p == q) 
     { 
      efinal[p] = 1; 
     } 
     else 
     { 
      if ((q - p + 1) % 2 != 0) 
      { 
       Ls = (p + q)/2 - 1; 
      } 
      else 
      { 
       Ls = (p + q)/2; 
      } 
      Ld = (p + q)/2 + 1; 

     } 


     Pliaza(p, Ls); 
     Pliaza(Ld, q); 
     /* 
     string ss = Ls.ToString(); 
     string sd = Ld.ToString(); 


     for (i = p; i <= Ls; i++) 
     { 

      aux[0] = 'S'; 
      string.Concat(aux, ss); 
      string.Concat(aux, " "); 
      string m = aux.ToString(); 
      string.Concat(aux, m[i]); 

     } 


      for (i = Ld; i <= q; i++) 
      { 
       aux[0] = 'D'; 
       string.Concat(aux,Ld); 
       string.Concat(aux, " "); 
       string m = aux.ToString(); 
       string.Concat(aux, m[i]); 


      } 
      */ 


    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     Pliaza(1, n); 
     for (i = 1; i <= n; i++) 
     { 
      if (efinal[i]!=0) 
      { 
       label2.Text = Convert.ToString(i); 
      } 
     } 


    } 

    private void label2_Click(object sender, EventArgs e) 
    { 

    } 
} 
} 

Répondre

0

Vous exécutez TOUJOURS la fonction Pliaza FROM Pliaza. Vous ne manquez pas une condition de finition?

La boucle récursive doit être terminée dans un certain temps, sinon vous aurez un débordement de pile.

0

Un StackOverflowException signifie généralement que vous avez une récursivité incontrôlée. En examinant votre code, je vois que Pliaza s'appelle deux fois, en utilisant différentes variables ... mais il y a non chemin pour Pliaza pour quitter sans s'appeler. Vous avez besoin d'un chemin pour laisser la récursion au fond. Très probablement ce serait d'ajouter une déclaration return; après la ligne efinal[p] = 1;.

+0

'Plierea_Vectorilor.Form1.Pliaza (int, int)': tous les chemins de code ne retournent pas une valeur –

+0

C'est idiot - c'est un vide, pourquoi devrait-il retourner une valeur? –

+0

J'ai changé "public void Pliaza" en "public int Pliaza" et j'obtiens cette erreur.je ne suis pas si bête ... J'ai essayé de mettre un commentaire le premier "si" mais je vois que j'ai la même erreur , et je suppose que le problème n'est pas là. –