递归

递归

  1. 严格定义递归函数的作用
  2. 递归的 终止条件
  3. 先一般,后特殊
  4. 规模最小化

demo1:递归求和

package com.mark.linked;

/**
 * author:Mark
 * date:2018/8/7  15:18
 * 利用递归的思想;求和
 * 1;规模最下化
 */
public class Sum {`这里写代码片`

    public static int sum(int[] arr) {//开放外界的接口
        return sum(arr, 0);
    }

    //计算arr【left,n)这个区间的和
    private static int sum(int[] arr, int left) {//内部实现递归
        if (left == arr.length) {//1.求解的基本问题
            return 0;
        }
        return arr[left] + sum(arr, left + 1);//2.规模最小化
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        int result = sum(arr);
        System.out.println("Sum is "+result);
    }
}

运行结果:

Sum is 45


demo2:取出集合中指定元素个数的所有可能

package com.mark.linked;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * author:Mark
 * date:2018/8/7  19:54
 * 在指定的结合中,取出n个元素的所有可能
 */
public class Combinations {

    /**
     *
     * @param data 输入的数据集合
     * @param n 在data中取出的元素的个数
     */
    public void getCombinations(List<Integer> data,int n){
        List<Integer> result = new ArrayList<>();//存取选择的数据
        getCombinations(result, data, n);
    }

    /**
     *
     * @param selected 选择的数据保存到selected中
     * @param data 输入的数据集合
     * @param n 在data中取出的元素的个数
     */
    private void getCombinations(List<Integer> selected, List<Integer> data, int n) {//内部实现递归的方法
        //递归的终止条件
        if (n == 0) {
            for (Integer i : selected){
                System.out.print(i);
                System.out.print(" ");
            }
            System.out.println();
            return;
        }
        if (data.isEmpty()) {
            return;
        }

        //规模最小化
        //如果选择第一个元素
        selected.add(data.get(0));//保存已选择的第一个数据
        getCombinations(selected,data.subList(1,data.size()),n-1);//在data【1,seize)中取出n-1个元素

        //如果没有选择第一个元素
        selected.remove(selected.size() - 1);
        getCombinations(selected,data.subList(1,data.size()),n);//在data【1,seize)中取出n个元素


    }

    public static void main(String[] args) {
        Combinations combinations = new Combinations();
        combinations.getCombinations(Arrays.asList(1, 2, 3, 4, 5), 2);
    }

}

运行结果:

1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5


demo3:递归创建链表
1.首先声明一个节点类

package com.link;

/**
 * author:Mark
 * date:2018/8/7  13:22
 * 节点
 */
public class Node {
    private final int value;//节点保存的数据
    private Node nextNode;//下一个节点

    Node(int value) {
        this.value = value;
        this.nextNode = null;
    }

    public int getValue() {
        return value;
    }

    public Node getNextNode() {
        return nextNode;
    }

    public void setNextNode(Node nextNode) {
        this.nextNode = nextNode;
    }

    public  static  String print(Node n) {
        Node node = n;
        StringBuffer stringBuffer = new StringBuffer();
        while (node != null) {
            stringBuffer.append(node.getValue());
            stringBuffer.append("->");
            node = node.nextNode;
        }
        stringBuffer.append("null");
        return stringBuffer.toString();
    }
}

2.递归实现形成链表

package com.link;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.Arrays;
import java.util.List;

/**
 * author:Mark
 * date:2018/8/7  12:48
 * 递归创建链表
 */

public class LinkedListCreator {

    /**
     * @param data 形成链表的数据
     * @return 头节点
     */
    public Node createLinkedList(List<Integer> data) {//递归方法
        //递归终止的条件
        if (data.isEmpty()) {
            return null;
        }

        Node firstNode = new Node(data.get(0));//第一个节点
        Node headOfSublist = createLinkedList(data.subList(1, data.size()));//在剩下的数据中创建链表
        firstNode.setNextNode(headOfSublist);
        return firstNode;
    }

    public static void main(String[] args) {
        Node node = new LinkedListCreator().createLinkedList(Arrays.asList(1, 2, 3, 4));
        System.out.println(Node.print(node));
    }
}

输出结果:

1->2->3->4->null

demo4:链表的反转

package com.link;

import java.util.Arrays;
import java.util.List;

/**
 * 链表的反转
 * author:Mark
 * date:2018/8/7  13:15
 */

public class LinkedListReverse {

    public Node reverseList(Node head) {//递归
        //递归的终止条件
        if (head == null ) {
            return null;
        }
        if (head.getNextNode() == null) {
            return head;
        }

        Node newHead = reverseList(head.getNextNode());
        head.getNextNode().setNextNode(head);
        head.setNextNode(null);
        return newHead;
    }

    public static void main(String[] args) {
        Node node = new LinkedListCreator().createLinkedList(Arrays.asList(1, 2, 3, 4));
        System.out.println("原链表:"+Node.print(node));
        node = new LinkedListReverse().reverseList(node);
        System.out.println("反转后"+Node.print(node));
    }

}



输出结果:

原链表:1->2->3->4->null
反转后4->3->2->1->null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值