算法-递归分治(经典例子)

* Xcode中完成

递归(recursion):程序调用自身的编程技巧。

递归满足2个条件:

1)有反复执行的过程(调用自身)

2)有跳出反复执行过程的条件(递归出口)

例子:

(1) 阶乘:

 n! = n * (n-1) * (n-2) * ...* 1(n>0)
int recursion(int value) {

    if(value ==0) {
        return 1;
    }else if(value >0) {
        return  value * recursion(value -1);
    }else {
        return 0;
    }
}
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        NSLog(@"3!=%d",recursion(3));
    }
    return 0;
}

(2) 全排列
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

如1,2,3三个元素的全排列为:

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

#import 

//交换函数
void swap( int *a , int *b)
{
    int temp ;
    temp = *a;
    *a=*b;
    *b=temp;
}
//排列函数
void perm(int list[], int begin, int k,int m)
{
    if (k == m) {
        for (int i = begin;i<=m; i++) {
            printf("%d,",list[i]);
        }
        printf("\n");
    }else{
        for (int i=k; i<=m; i++) {
            swap(&list[i], &list[k]);
            perm(list, begin,k+1, m);
            swap(&list[i], &list[k]);
        }
    }
}
//调用排列函数,旨在添加一个不变量,纪录要随递归变化的k值;
//函数意义:列出list数组从第k到第m的全排列(数组从0开始计数)
void permutation(int list[],int k,int m)
{
    perm(list,k , k, m);
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
       int list[5]={1,2,3,4,5};
       permutation(list, 0,2);
    }
    return 0;
}
![运行结果截图](http://img.blog.csdn.net/20151007200310165)
PS:值交换函数swap函数区别于以下两种写法:    
//写法一:
void swap( int *a , int *b)
{
    int *temp ;
    temp = a;
    a=b;
    b=temp;
}
//这种写法在函数中改变了两个指针变量形参的数值,但是没有将改变后的数值传递回main函数,因此,main函数中不会发生变化

//写法二:
void swap( int *a , int *b)
{
    int *temp ;
    *temp =* a;
    *a=*b;
    *b=*temp;
}
//*temp代表temp所指向的变量,但是temp并没有确定的地址值,所以它的值也就不可预见,*temp指向的单元也是不可预见的,因此对*temp赋值可会破坏系统正常工作状况。应该是将*a的值赋给一个整形变量。

(3)斐波那契数列

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
这个数列从第三项开始,每一项都等于前两项之和。
第n项的值即为fibonacci(n)。

#import 
int fibonacci(int n)
{
    if (n == 0 ) {
        return 0;
    }else if(n ==1){
        return 1;
    }else{
        return fibonacci(n-1)+fibonacci(n-2);
    }
}


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        NSLog(@"%d",fibonacci(4));

    }
    return 0;
}

(4)二分搜索(分治)
给定排好序的数组list[],在数组n个元素中找出特定x,返回其在数组的位置序号。

#import 

//函数意义:在含有n个元素的数组list中查找元素x返回x的序号(-1)代表未找到
int binarySearch (int list[],int n,int x){
    int left=0,right=n-1;
    while ( left <= right ) {
        int mid = (left+right)/2;
        if (x == list[mid]) {
            return mid;
        }else if(x<list[mid] ) {
            right=mid-1;
        }else {
            left=mid+1;
        }
    }
    return -1;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        int list[5]={1,2,3,4,5};
        int n=5;
        int x=3;
        NSLog(@"%d",binarySearch(list, n, x));

    }
    return 0;
}

(5)快速排序

#import 

void swap( int *a , int *b)
{
    int temp ;
    temp = *a;
    *a=*b;
    *b=temp;
}

//函数意义:从数组list中(从p到r)随机获取其中一个数,把小于它的放在它左边,大于它的放在它右边,返回最后这个值的位置
int partition(int list[], int p,int r) {

    int randomIndex=(int)random()%(r-p+1);
    int leftTemp=randomIndex-1;
    int rightTemp = randomIndex+1;
    int x=list[randomIndex];
    for (int i=p; iif (x<list[i]) {
            swap(&list[i], &list[leftTemp]);
            swap(&list[leftTemp], &list[randomIndex]);
            randomIndex--;
        }
    }for (int i=r ; i>randomIndex; i--) {
        if (x>list[i]) {
            swap(&list[i], &list[rightTemp]);
            swap(&list[rightTemp], &list[randomIndex]);
            randomIndex++;
        }
    }

    return randomIndex;
}
//函数意义:对无序数组的p到r进行从小到大的排序
void quickSort(int list[],int p,int r){
    if(pint q=partition(list,p,r);
        quickSort(list, p, q-1);
        quickSort(list, q+1, r);
    }
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        int list[5]={1,5,3,2,4};
        quickSort(list,0,4);
        for (int i=0; i<=4; i++) {
            printf("%d," , list[i]);
        }
    }
    return 0;
}

你可能感兴趣的:(算法)