zzgisi
2016-07-06 17:26
采纳率: 100%
浏览 3.4k
已采纳

[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循环写出来吗,或者需要打什么草稿,然后怎么做,请高手指点一下,

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • threenewbee 2016-07-06 19:21
    已采纳
     循环可以非常简单地转换为递归,只有尾递归可以机械转换为循环,否则需要借助堆栈。
    转换方式
    比如有如下函数:
    返回值 foo()
    {
    局部变量列表
    while (条件)
    {
    代码块
    }
    return 返回值
    }
    改写成递归
    返回值 foo(局部变量列表)
    {
    if (!条件) return 返回值;
    代码块
    return foo(局部变量列表);
    }
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • threenewbee 2016-07-06 19:24
     举个例子
    void print10times()
    {
    int i = 0;
    while (i++ < 10)
    println("hello");
    }
    改写
    void print10times(int i)
    {
    if (i == 10) return;
    println("hello");
    print10times(i++);
    }
    
    评论
    解决 无用
    打赏 举报
  • threenewbee 2016-07-06 19:30

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

    评论
    解决 无用
    打赏 举报
  • legend_night 2016-07-07 01:27

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

    if(n <= 0) return 0;

    return add(--n) + n;
    }

    // 调用 add(100);

    评论
    解决 无用
    打赏 举报
  • 11061104 2016-07-27 12:23

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

    评论
    解决 无用
    打赏 举报
  • 善良的triumph 2016-07-28 09:12

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

    评论
    解决 无用
    打赏 举报
  • 一只写bug的程序猿 2016-07-29 06:32

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

    评论
    解决 无用
    打赏 举报
  • xiaoxiang-chen 2016-08-04 06:31

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

    评论
    解决 无用
    打赏 举报
  • ifkirin 2016-08-05 10:00

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题