【C语言】递归练习

递归参考文章:https://www.cnblogs.com/kubidemanong/p/10538799.html

//递归:二分查找
int BinaryFind(int* arr, int left, int right, int value)
{
    
    
    int pos = -1;
    if(arr == NULL || left < 0 || right < left )
    {
    
    
        return pos;
    }
    else
    {
    
    
        int mid = (left + right) / 2;
        if(arr[mid] > value)
        {
    
    
            return BinaryFind(arr, left, mid - 1, value);
        }
        else if(arr[mid] < value)
        {
    
    
            return BinaryFind(arr, mid + 1, right, value);
        }
        else
        {
    
    
            pos = mid;
        }
         return pos;
    }
    
}

//二分查找(非递归)
int BinaryFind(int* arr, int len, int value)
{
    
    
    int pos = -1;
    if(arr == NULL || len <= 0)
    {
    
    
        return pos;
    }
    int left = 0;
    int right = len - 1;
   
    while(left <= right)
    {
    
    
        int mid = (left + right) / 2; 
        if(arr[mid] > value)
        {
    
    
            right = mid - 1;
        }
        else if(arr[mid] < value)
        {
    
    
            left = mid + 1;
        }
        else
        {
    
    
            pos = mid;
            break;
        }
    }
    return pos;
}


//n的阶乘
int Mul_N(int n)
{
    
    
    if(n == 1 || n == 2)
    {
    
    
        return n;
    }

    //关系式
    return n * Mul_N(n - 1);
}

//普通查找一个值
int FindValue(int* arr, int len, int value)
{
    
    
    int pos = -1;
    if(arr == NULL || len < 1)
        return pos;
    else if(arr[len - 1] == value)
    {
    
    
        pos = len - 1;
    }
    else
    {
    
    
        return FindValue(arr, len - 1, value);
    }
}


//递归输出数组元素
void Show(int* arr, int len)
{
    
    
    if(arr == NULL || len < 1)
        return;
      
    printf("%d ", arr[len - 1]);
    Show(arr, len - 1);
}


//非递归:斐波那契数列求第n项
int FiBo(int n)
{
    
    
    if(n < 1)
        return -1;

    if(n < 3)
    {
    
    
        return 1;
    }
    int a = 1;
    int b = 1;
    int c = 1;
    for(int i = 3; i <= n; i++)
    {
    
    
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}

//递归:计算斐波那契数列第n项
int FiBo(int n)
{
    
    
    if(n < 1)
    {
    
    
        return -1;
    }
    if(n < 3)
    {
    
    
        return 1;
    }
    else
    {
    
    
        return FiBo(n - 1) + FiBo(n - 2);
    }
}

//汉诺塔
void Move(char src, char des)
{
    
    
    printf("%c --> %c\n", src, des);
}

void HanNuo(char src, char mid, char des, int count)
{
    
    
    if(count == 1)
    {
    
    
        Move(src, des);
        return;
    }
    else
    {
    
    
        HanNuo(src, des, mid, count - 1);
        Move(src, des);
        HanNuo(mid, src, des, count - 1);
    }
}

猜你喜欢

转载自blog.csdn.net/xiaoxiaoguailou/article/details/121731453