我在大学项目中遇到了麻烦。项目需要使用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)
{
}
}
}
答案 0 :(得分:0)
你总是执行Pliaza的Pliaza函数。你不是错过了完成条件吗?
递归循环必须在某个时候完成,否则你会得到堆栈溢出。
答案 1 :(得分:0)
StackOverflowException
通常意味着您正在进行不受控制的递归。检查您的代码时,我发现Pliaza
使用不同的变量调用了两次......但Pliaza
有没有路径退出而没有自称。你需要一些路径让递归降到最低点。这很可能是在return;
行之后添加efinal[p] = 1;
语句。