在c#中使用Divide et Impera折叠矢量

时间:2016-01-06 17:28:07

标签: c# windows forms vector folding

我在大学项目中遇到了麻烦。项目需要使用c#作为编程语言,并在Windows Form中制作。 程序执行。我知道它有缺陷,但至少我想知道如何得到这个错误:http://postimg.org/image/gwuzmyc73/。 对于这个问题,我需要使用Divide et Impera折叠矢量。 我需要从键盘n插入一个数字,生成的矢量就像a =(1,2,3,4,5,6,7),最后的元素是1,3,5,7。 问题听起来像: n个元素的向量。如果n是奇数,我们通过重叠2个半来定义它的折叠。再将2个半折叠,直到de子向量达到1个元素。利用Divide et Impera。

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)
    {

    }
}
}

2 个答案:

答案 0 :(得分:0)

你总是执行Pliaza的Pliaza函数。你不是错过了完成条件吗?

递归循环必须在某个时候完成,否则你会得到堆栈溢出。

答案 1 :(得分:0)

StackOverflowException通常意味着您正在进行不受控制的递归。检查您的代码时,我发现Pliaza使用不同的变量调用了两次......但Pliaza没有路径退出而没有自称。你需要一些路径让递归降到最低点。这很可能是在return;行之后添加efinal[p] = 1;语句。