* 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;
}