数学归纳法与递归学习

递归学习记录

递归是什么

递归的定义:重复的将问题分解为子问题解决问题的方法。

数学归纳法

我们在证明一个公理时,如求1+2+3+……+n=n(1+n)/2
根据公理可以看到如下规律:
1=11+1)/2
1+2=2
(1+2)
1+2+3=3*(1+3)/2
如是可以猜想出
1+2+3+……+n-1=(n-1)(1+n-1)/2
根据猜想证明:
1+2+3+……+n-1+n=(n-1)(1+n-1)/2 +n
=n(n-1)/2 +n
=n*(n-1)/2
一个递归算法设计时,我们可以把它当错一个要证明的公理,然后将问题缩小成子规模如上面的案例。设计一个方法求1+2+3+……+n。
设计方法时,明确方法的返回值,参数;假设求和的方法为:int sum(int n);
思考问题的规模是什么,每次缩进多少才能变成上面的子问题。
设计算法时,先从一般出发,特殊情况特殊处理。
public int sum(int n){
//因为根据问题知道参数不能小于零,所以n-1>0,由于问题规模是按照1缩进的,所以再次整合,可以知道,当n<=0时,停止递归开始回溯栈中未执行完的方法。
//特殊情况的处理
if(n<=0){
return 0;
}
//一般情况的处理
return n+sum(n-1);
}
运行侧视图:
在这里插入图片描述
使用递归生成链表:
//定义方法,等会儿我们去需要证明 Node createNode(String node){
//
}

//Node 链表的节点,这里以单向链表为例
public class Node {
   public class Node {
    private  final Object value;
    private  Node next;
    public void setNext( Node node){
        this.next=node;
    }
    public Node getNext(){
        return this.next;
    }
    public Object getValue(){
        return this.value;
    }
  public Node(Object value){
      this.value=value;
      this.next=null;
    }
    public Node(){
        this.value=0;
    }
  public  static void print(Node node){
        Node pre=node;
        while(pre!=null){
            System.out.print(pre.getValue()+" ");
            pre=pre.getNext();
        }
    };

}
//生成链表的方法证明
 Node createLinkListByString(String node){
        if(node.isEmpty()){
            return null;
        }
        char nodeChar=node.charAt(0);
        Node newNode=new Node(String.valueOf(nodeChar));
        //按照规模生成下一个节点
        Node head=createLinkListByString(node.substring(1,node.length()));
        newNode.setNext(head);
        return newNode;
    }

测试生成链表图
链表生成图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值