[JAVA]for循环换成递归有没有什么套路?反之呢?

本人是刚刚自学java过来的,偶然机会看到一个视频,说有的时候需要使用递归,
尤其是在java中的删除多级目录,于是我就开始琢磨,有没有什么套路呢,
现在有一个简单案例,就是把1+到100的等差数列求和,
首先是简单的for循环写法:

    @Test
    public void testAdd(){
        String str="1";
        System.out.println(str);
        int result=0;
        for(int i=2;i<=100;i++){
            str+=("+"+i);
            result+=i;
            System.out.println(str+"="+(result+1));
        }
    }

这是改写的递归法,
每一步是输出结果
然而这简单的算法,我却琢磨了很久,感觉里面有一些东西非常接近,

递归写法**

 public class DemoAdd {
    static int result=1;
    public static int add(int n) {
        if (n < 100) {
            result += (++n);
            System.out.println(result);
            return add(n);
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        add(1);
    }

}

现在问题来了,就是新手在学习递归方法的时候,有没有什么思维套路,
不可能每次需要使用的时候都要琢磨半天吧,
比如我需要先把for循环写出来吗,或者需要打什么草稿,然后怎么做,请高手指点一下,

 循环可以非常简单地转换为递归,只有尾递归可以机械转换为循环,否则需要借助堆栈。
转换方式
比如有如下函数:
返回值 foo()
{
局部变量列表
while (条件)
{
代码块
}
return 返回值
}
改写成递归
返回值 foo(局部变量列表)
{
if (!条件) return 返回值;
代码块
return foo(局部变量列表);
}
 举个例子
void print10times()
{
int i = 0;
while (i++ < 10)
println("hello");
}
改写
void print10times(int i)
{
if (i == 10) return;
println("hello");
print10times(i++);
}

递归转换循环有两种情况,如果递归是尾递归(递归调用语句在函数中是最后一个语句,或者说,就是我们用循环简单改写成的那种递归),那么可以直接按照上述步骤的逆步骤改回来。
否则必须依靠堆栈才行。这是因为在尾递归中,实际上调用递归下层函数以后不会再用到被函数的局部变量了,所以也不需要额外的将当前函数的上下文存储起来,再在调用完后再恢复的额外步骤,所以不需要堆栈。

// 首先确认递归完结条件,依次调用自身
public int add(n) {

if(n <= 0) return 0;

return add(--n) + n;
}

// 调用 add(100);

递归的结束条件+调用自身 ------这是重要因素;
如何从for循环变为递归函数--------for语句的结束条件就是递归的技术条件,调用自身(只是循环体的多次调用)

递归就是自身调用,但必须要有出口,即不能无止境的调用。
而循环是不断地重复自身语句。

第一次见递归的时候感觉这世界真神奇

递归,首先你需要找到 f(n)与f(n-1)或者f(n-2)等等之间的关系,最后找出递归跳出的条件就可以了。

在没有足够强硬的递归基础的情况下,不介意使用递归的,在Java中递归用不好的话,对应资源的消耗是很大的。有这么一句话,是神用递归,人用循环。对于递归最好支持的例子,是Erlang。不过对于矩阵类型的问题还是递归来的方便。