为什么输出的只有5

wsxqaz 2005-12-30 06:44:33
下面为什么输出的只有5
private int a(int i)
{
int c=0;
if(i==0)
{
c=0;
return 0;
}
else
{
textbox1.text=textbox1.text+a(i-1));
return i;
}

}
private void b()
{
a(5);
}
...全文
158 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanreid 2005-12-31
  • 打赏
  • 举报
回复
看看我的程序,结果还是4

namespace WindowsApplication1
{

public partial class Form1 : Form
{
public int x =0;
private int a(int i)
{
if(i==0)
{
return 0;
}
else
{
x = x + a(i - 1);
return i;
}

}
private void b()
{
a(5);
}

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

b();
textbox1.Text = x.ToString();
}
}
}
wsxqaz 2005-12-31
  • 打赏
  • 举报
回复
名白了我用Arraylist在每一次递归时Add一个这个时候arraylist里到是有各个值的
止戈而立 2005-12-31
  • 打赏
  • 举报
回复
当你执行a(5)的时候。。
那么:
textbox1.text=textbox1.text+a(i-1);实际上就是:
textbox1.text=textbox1.text+a(4);现在不知道你看懂了没有?无论你在计算a(4)的过程中,i怎么变。最终要 求的是a(4)的值。。



对比一下上面的朋友给你改后的代码吧:

winterice(冬天的冰)

else
{
textbox1.text=textbox1.text+a(i-1));
return i;
}

改成:
else
{
int d=a(i-1);
textbox1.text=textbox1.text+d;//
return i;
}
就输出“01234”了
wsxqaz 2005-12-31
  • 打赏
  • 举报
回复
我没有看懂为什么textbox1.text=textbox1.text+a(i-1)等于textbox1.text=a(i-1),虽然a(i)反回的是一个整型,但是textbox却可以保存字符,而且textbox在每一次帝归的时候都被付过值了,但是在下一次的时候textbox又恢复原来的值了
止戈而立 2005-12-31
  • 打赏
  • 举报
回复
我说过了:textbox1.text=textbox1.text+a(i-1);这一句相当于textbox1.text=a(i-1);
随着i的变化,a(i-1)的值当然会跟着变了。。
wsxqaz 2005-12-31
  • 打赏
  • 举报
回复
我跟了一下发现,每一次递归调用以后,textbox1.text里的值都在变,也就是textbox1.text=a(i-1)的值,比如i=1时textbox1.text=1(textbox.text确实被付值了)但是这个值并没有被保存下去,在跳到下一个递归的地方时值并没有相加,而是从新给textbox付值了,大家跟跟看,每一次递归调用以后好象textbox里是用值的
止戈而立 2005-12-31
  • 打赏
  • 举报
回复
另外提一句:
textbox1.text的结果为什么只输出了一个4。。而没有在多次执行该行代码后获得很多的值。。
这是因为
a(i-1)只返回最终的一个值。。放在哪里它都返回一个整型值。。不会有其它。。
因此textbox1.text如果原本是空字符串,那么textbox1.text=textbox1.text+a(i-1);这一句相当于textbox1.text=a(i-1);
dwp008 2005-12-31
  • 打赏
  • 举报
回复
min_jie(止戈)
调试了一下,终于看明白了。。

首先i的值从5一步步自减到0,算出了a(0)的值。。
然后又从0一步步自增到5,算出a(5)的值。。。

大家可以自己调试看看。。

这个是正解
递归都这样啊

winterice(冬天的冰) 说的方法正好可以反映出最后递归的顺序
止戈而立 2005-12-31
  • 打赏
  • 举报
回复
帮你分析一下代码:
private int a(int i)
{
int c=0;//这个变量没意义
if(i==0)
{
c=0;//没意义
return 0;//这表示a(0)=0
}
else
{
textbox1.text=textbox1.text+a(i-1);//这一句跟返回值没什么关系,也可暂时不看
return i;//这个表示a(i)=i,不要受上一句的影响,返回值跟上一句无关。a(5)当然等于5
}
}

当然,textbox1.text最后的值是4。因为a(i-1)=a(4)=4
止戈而立 2005-12-31
  • 打赏
  • 举报
回复
调试了一下,终于看明白了。。

首先i的值从5一步步自减到0,算出了a(0)的值。。
然后又从0一步步自增到5,算出a(5)的值。。。

大家可以自己调试看看。。
winterice 2005-12-31
  • 打赏
  • 举报
回复
应该输出4,把那代码
else
{
textbox1.text=textbox1.text+a(i-1));
return i;
}

改成:
else
{
int d=a(i-1);
textbox1.text=textbox1.text+d
return i;
}
就输出“01234”了
wsxqaz 2005-12-30
  • 打赏
  • 举报
回复
应该是4

我不管是字符连接还是相加反正都不应该输出一个数啊

就算是字符连接也应该是123……
net_explorer 2005-12-30
  • 打赏
  • 举报
回复
问题在于他用的是字符型的和整形的相加了.这样的话,就是字符串之间的连接了.
yuanreid 2005-12-30
  • 打赏
  • 举报
回复
to ChengKing(Enthusiasm Bigrosoft)
你运行试试吧
yuanreid 2005-12-30
  • 打赏
  • 举报
回复
用C++试了试,结果是对的返回10。即 0+1+2+3+4 = 10
而用C#跟踪了一下,发现是 0+1+1+1+1 = 4

确实不解。
ChengKing 2005-12-30
  • 打赏
  • 举报
回复
a()方法第一次执行的时候,这句: return i; 就执行了,且返回了:5

中间虽然进行了许多递归调用,但根本不影响最终结果: 5
yuanreid 2005-12-30
  • 打赏
  • 举报
回复
我输出的是4

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧