java语言中:循环一定可以改成递归吗?

2025-03-10 12:13:04
推荐回答(3个)
回答1:

我和同学也讨论过这个问题,也问过老师。我们可以从这个角度考虑下,循环和递归在执行的时候都是用栈操作的,那么很显然循环是可以写成递归的,同样递归也是可以写成循环的。循环写成递归,基本思路嵌套递归,不过我递归学的不是很好,嵌套递归又很复杂所以我只写过两重的,而且很简单,具体原型可以参考数据结构里树的遍历。而递归转化为循环我没有研究过,有一次问老师,老师说:递归理论上是可以用循环做的,不过很麻烦。最终我放弃了尝试递归和循环的转换。用我们老师的话说:不同的数据结构的组织形式和实现方式都不一样,所实现的功能也不一样,没有必要去做那个转换,关键是搞明白他的执行过程最终能使用就可以了。

回答2:

改好了

public class Test
{
public static void main(String[] args)
{
print("",3);
}
public static void print(String sum, int depth)
{
for(int i=0;i<10;i++)
{
sum+=i;
if(depth==1)
System.out.println(sum);
else
print(sum,depth-1);
sum=sum.substring(0,sum.length()-1);
}
}
}

另外:
递归和迭代(比如你说的循环,使用控制流语句来完成功能)是可以完全转化的.
递归的优势在于在处理一些问题的时候,递归的思想比较简洁.递归的劣势在于,与迭代相比,递归由于频繁调用函数和展开函数栈,有额外的时间和空间的消耗.
所以说,有时候递归有助于程序员用简单的思想书写代码,但是对用户来说,用递归写成的代码必然会有耗时长(小程序体现不出来)和占用内存多的劣势.
所以说,程序员要做的应该是尽可能的把递归问题转化为迭代问题.
而把迭代转化为递归,一般是不需要的.

一般来说,对于步骤不可预测的操作,不能使用递归,而对于步骤有限的操作,如果用递归很简洁的话,可以考虑使用递归.

举个递归弊端的例子吧:
public class Test
{
public static void main(String[] args)
{
System.out.println(sum(999));
//System.out.println(sum(999999));
}
public static int sum(int i)
{
if(i>0)
return sum(i-1)+i;
else
return 0;
}
}

这是一个求和的递归写法,因为调用函数有额外的控件消耗,当你要求一个较大数的和时,用递归就出错了,展开函数太多,栈溢出了,提示:
Exception in thread "main" java.lang.StackOverflowError

回答3:

不好做