递归

Posted on 2020-08-09 17:53  金色的省略号  阅读(107)  评论(0编辑  收藏  举报

  一、一个台阶总共有n级,如果一次可以跳1级,也可以跳2级...,也可以跳上n级,此时跳上一个n级的台阶总共有多少种跳法

  递归函数的返回值,2*f(n-1),是数学归纳出来的

      f(n) = f(n-1) + f(n-2) + … + f(n-(n-1)) + f(n-n);
即,  f(n) =   f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1);
得出,f(n-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2);
替换,f(n) =  f(n-1) + f(n-1);
      f(n) =  2*f(n-1);

  c语言,递归代码

int f(int n) {
    if(n==0) 
        return 0;
    else if(n==1)
        return 1;
    else
        return 2*f(n-1);
}

  二、递归折半查找

#include<stdio.h>

//递归折半查找
int find(int a[],int x,int n,int m){
    int i;
    //未找到
    if(n>m){
        return -1;
    }
    //折半    
    i=(n+m)/2;
    //找到了
    if(a[i]==x){
        return i;
    }
    //向左查找    
    if(a[i]>x){
        return find(a,x,n,i-1);
    }
    //向右查找
    return find(a,x,i+1,m);
}
int main(){
    //折半查找的前提是,数据是有序的
    int a[20]={2,3,6,7,12,18,19,21,25,28,30,33,37,39,42,45,47,49,50,51};
    int x,i;
    printf("已有的数是:\n");
    for(i=0;i<20;i++)
        printf("%d ",a[i]);
    printf("\n请输入要查找的数:");
    scanf("%d",&x);
    if((i=find(a,x,0,19))>=0) //找到了
        printf("%d是第%d个数\n",x,i+1); //下标是从0开始的
    else  //未找到
        printf("未找到%d\n",x);
    return 0;
}