zoukankan      html  css  js  c++  java
  • 递归的定义与使用

    1、定义是递归的:

    (1)n!的递归实现:

    递归方法:

    public class Method {
        int fun(int n){
        if(n==1)
            return 1;
        else
            return(fun(n-1)*n);
        }
    }
    public class RecursionDemo {
        public static void main (String[] args){
          Method m=new Method();
          int num=m.fun(3);
          System.out.println(num);
        }
    }

    递归方法分析:

    (1)该方法是直接递归,即自己调用自己。

    例如:在执行fun(3)的时候,先执行fun(2)*3,而fun(2)=fun(1)*2,fun(1)=1。

    (2)递归过程将问题的规模逐步缩小,参数的大小每次减1。一个个重复的过程,通过调用自身,减少了代码量。

    (3)因为递归调用语句是在最后一句,因此,这种递归方式也称为尾递归。

    2、数据结构是递归的:

           单链表的存储结构定义。

    3、问题的求解是递归的:

    #include<stdio.h> 
    #include<malloc.h> 
    #include<stdlib.h>
    #define LIST_INIT_SIZE 100 
    #define LISTINCREMENT 10
    #define OVERFLOW -2
    #define ERROR 0 
    #define OK 1
    typedef int ElemType; 
    
    typedef struct{ //存储结构 
    ElemType *elem; //指针类型 
    int length; 
    int listsize; 
    }SqList;//顺序表的结构类型 
    
    typedef int Status; 
    
    Status InitList(SqList &L){         
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//动态分配存储空间 
    if(!L.elem) exit(OVERFLOW);  //分配失败退出 
    L.length=0;                  //空表 
    L.listsize=LIST_INIT_SIZE; //初始存储容量 
    return OK; 
    }
    
    Status ListInsert(SqList &L,int i,ElemType e){//在第 i 个元素前插入一个新的元素e 
    if(i<1 || i > L.length+1) return ERROR; //i值不合法 
    if(L.length>=L.listsize) //存储空间不足 
    { 
    ElemType * newbase=(ElemType *)realloc(L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType)); 
    if(!newbase) exit(OVERFLOW); //分配失败 
    L.elem=newbase; 
    L.listsize=LIST_INIT_SIZE+LISTINCREMENT;
    } 
    for (int j=L.length; j>=i; --j)
    L.elem[j]=L.elem[j-1]; 
    L.elem[i-1]=e; 
    L.length++;
    return OK; 
    }
    
    Status ListEmpty(SqList L){ //判断顺序表是否为空
    return L.length == 0; 
    }
    
    Status ListPrint(SqList &L) { 
    printf(" 顺序表为: "); 
    if (ListEmpty(L)) { 
    printf(" 空。 
    "); 
    return ERROR; 
    } 
    for (int i=0; i<L.length; ++i) 
    { 
    printf("%-4d ", L.elem[i]); 
    } 
    printf("
    "); 
    return OK; 
    }
    
    int Sum(SqList L,int i){
    
        if(i==L.length)
        return 0;
        else 
        return(L.elem[i]+Sum(L,i+1)); 
    } 
    
    main(){
        
    SqList L; 
    ElemType e; 
    int i,j; 
    InitList(L); 
    
    
    printf(" 请输入你想创建的顺序表中元素的个数: "); 
    scanf("%d",&i); 
    if(i<1) printf(" 您输入的值有误,无法创建顺序表。 
    "); 
    else 
    { 
    printf(" 请您依次输入您想创建的顺序表的元素: "); 
    for(j=1;j<=i;j++) 
    { 
    scanf("%d",&e); 
    ListInsert(L,L.length+1,e); //尾插 
    } 
    } 
    ListPrint(L); //遍历顺序表 
    int result=Sum(L,0);
    printf( "顺序表所有元素的和为:%d",result);
    }

    这个程序是求解顺序表的元素的和,从顺序表的第一个元素开始,依次向后查找元素,并进行求和运算。

    4、递归的条件:

    (1)需要解决的问题可以转化为一个或者多个子问题来求解,而这些子问题的求解方法与原问题相同,只是在数量和规模上不同。

    (2)递归的次数是有限的。

    (3)必须有结束递归的条件来终止递归。

  • 相关阅读:
    poj3032
    poj2603
    poj2019
    poj2369
    AVI 录像功能压缩算法设置
    陆其明的新书《脚本驱动的应用软件开发方法与实践》
    c# 动态编译
    !!!分享:把bmp格式的图片转化为AVI格式的视频操作的封装类其中对于AVI API的函数的使用较为完整
    视频文件格式和视频编码方式
    activex 控件的id 定义位置+使用ocx控件的客户端程序中对控件定义的文件中控件id定义的位置
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11552938.html
Copyright © 2011-2022 走看看