递归

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);
    }
}
原文地址:https://www.cnblogs.com/virusdefender/p/3409530.html