• 递归


    http://www.nowamagic.net/librarys/veda/detail/2316

    回文问题的递归判断

    #include "stdio.h"
    #include "string.h"
    
    int main(void)
    {
        int n, rs;
        char str[50];
    
        printf("请输入需要判断回文的字符串:");
        scanf("%s",&str);
    
        n = (int)strlen(str);
        rs = is_palindereme(str, n);
        printf("%d ", rs);
    }
    
    int is_palindereme(char *str, int n)
    {
        printf("Length: %d 
    ",n);
        printf("%c ----- %c
    ", str[0], str[n-1]);
        if(n == 0 || n == 1)
            return 1;
        else{
            //printf("%d, %d
    ", str[0], str[n-1]);
            return ((str[0] == str[n-1]) ? is_palindereme(str+1, n-2) : 0);
        }
    }

    二分查找的递归实现

    #include "stdio.h"
    #include "stdlib.h"
    
    void selectionSort(int data[], int count);
    int binary_search(int *a, int n, int key);
    
    void main()
    {
        int i, key, rs;
        int arr[10];
        int count;
    
        printf("排序前数组为:");
        srand((int)time(0));
        for(i=0; i < 10; i++)
        {
            arr[i] = rand()%100;
            printf("%d ",arr[i]);
        }
    
        count = sizeof(arr)/sizeof(arr[0]);
        selectionSort(arr, count);
    
        printf("
    排序后数组为:");
        for(i=0; i < 10; i++)
        {
            printf("%d ", arr[i]);
        }
    
        printf("
    请输入要查找的数字:");
        scanf("%d",&key);
    
        rs = binary_search(arr, 10, key);
        printf("%d ", rs);
    }
    
    void selectionSort(int data[], int count)
    {
        int i, j, min, temp;
        for(i = 0; i < count; i ++) {
            /*find the minimum*/
            min = i;
            for(j = i + 1; j < count; j ++)
                if(data[j] < data[min])
                    min = j;
            temp = data[i];
            data[i] = data[min];
            data[min] = temp;
        }
    }
    
    int binary_search(int *data, int n, int key)
    {
        int mid;
        if(n == 1){
            return (data[0] == key);
        }else{
            mid = n/2;
            printf("mid=%d
    ", data[mid]);
            if(data[mid-1] == key)
                return 1;
            else if(data[mid-1] > key)
            {
                printf("key %d 比 data[mid-1] %d 小,取前半段 
    ", key, data[mid-1]);
                return binary_search(&data[0], mid, key);
            }
            else
            {
                printf("key %d 比 data[mid-1] %d 大,取后半段 
    ", key, data[mid-1]);
                return binary_search(&data[mid], n - mid, key);
            }
        }
    }

    优化的费波纳茨递归法

    int fib_i(int a, int b , int n)
    {
        if(n == 3)
            return a+b;
        else
            return fib_i(b, a+b, n-1);
    }

    考虑一下这个

    尾递归计算

    尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代码的开头来实现的。如果有尾部归递,就只需要叠套一个堆栈,因为电脑只需要将函数的参数改变再重新调用一次。利用尾部递归最主要的目的是要优化
    #include "stdio.h"
    #include "math.h"
    
    int factorial(int n);
    
    int main(void)
    {
        int i, n, rs;
    
        printf("请输入斐波那契数n:");
        scanf("%d",&n);
    
        rs = factorial_tail(n, 1, 1);
        printf("%d ", rs);
    
        return 0;
    }
    
    int factorial_tail(int n,int acc1,int acc2)
    {
        if (n < 2)
        {
            return acc1;
        }
        else
        {
            return factorial_tail(n-1,acc2,acc1+acc2);
        }
    }
  • 相关阅读:
    (8)FastDFS
    (7)文件上传
    (6)品牌新增
    数据仓库_MySQL(2)
    数据仓库_Linux(5)&MySQL(1)
    J哥说生产事故之僵尸进程
    J哥说生产事故之CPU爆表
    idea classpath
    (五)返回两个数组之间的差异
    (四)数组扁平化
  • 原文地址:https://www.cnblogs.com/virusdefender/p/3409530.html
Copyright © 2020-2023  润新知