我现在正在学习递归,我觉得我非常理解递归是如何工作的,然后我看到了这段代码,我的脑袋即将爆炸。
我知道这个简单的递归就像
一样public void recursivePrint(int number){
if(number == 0{
return;
}
System.out.println(number + " ");
recursivePrint(number - 1);
}
如果参数“number”的值为2。
public void recursivePrint(2){
if(number == 0{
return;
}
System.out.print(2 + " ");
recursivePrint(2 - 1);
}
public void recursivePrint(1){
if(number == 0{
return;
}
System.out.print(1 + " ");
recursivePrint(1 - 1);
}
然后停止,因为它符合基本情况。
这打印字符串函数的所有排列怎么样?
private void permute(String str, int l, int r)
{
if (l == r)
System.out.println(str);
else
{
for (int i = l; i <= r; i++)
{
str = swap(str,l,i);
permute(str, l+1, r);
str = swap(str,l,i);
}
}
}
for循环中有一个递归调用。如果输入值为“ab”,则此递归函数如何工作?你能解释一下我上面写的吗? 我有这个代码形式geeksforgeeks,并有一个视频,但我无法理解这一点,因为我不知道循环如何循环。
答案 0 :(得分:1)
当方法调用自身时发生递归。这种方法称为递归方法。递归方法可能比等效的非递归方法更简洁。但是,对于深度递归,有时迭代解决方案可以消耗较少的线程有限堆栈空间。
什么是递归: 通常,递归是函数直接或间接调用自身的时间。例如:
{{1}}
将递归应用于问题的条件: 使用递归函数解决特定问题有两个前提条件:
问题必须有一个基本条件,它将是递归的端点。当一个 递归函数达到基本条件,它不再进行(更深)递归调用。
每个级别的递归都应该尝试一个较小的问题。因此递归函数将问题分成越来越小的部分。假设问题是有限的,这将确保递归终止。
在Java中有第三个先决条件:没有必要过于彻底地解决问题;
以下函数使用递归计算阶乘。注意方法factorial如何在函数内调用自身。每次调用自身时,它会将参数n减少1.当n达到1(基本条件)时,函数将不再递归。
{{1}}
答案 1 :(得分:1)
使用permute
函数生成字符串,其中l
char被其后的一个char替换。在其中有for
循环的情况下,您将逐个触摸每个跟随字符。
通过多次调用permute
,您可以前进直到字符串的end
位置,end
由{{1}检查}}
以if (l == r)
。
abc
仅供参考,如果您不熟悉递归或编程,那么排列并不容易理解。为了便于理解,请使用笔纸。