由易到难学习递归的精华

来源:互联网 发布:淘宝 折扇 编辑:程序博客网 时间:2024/05/16 03:42

下面是收集的一些递归实现的小算法,勤加练习,相信每一个人都能对简单的递归驾驭自如!

1加到n的一种递归的简洁写法

int AddFrom1ToN_Recursive(int n){return n<=0 ? 0 : n+AddFrom1ToN_Recursive(n-1);}

2进制,8进制,16进制的递归写法,原理相同!

void go2(int nNum){if (nNum == 0)return;else{go2(nNum / 2);printf("%d", nNum % 2);}}void go8(int nNum){if (nNum == 0)return;else{go8(nNum / 8);printf("%d", nNum % 8);}}void go16(int nNum){if (nNum == 0)return;else{go16(nNum / 16);printf("%d", nNum % 16);}}


许多时候我们都能够使用一个栈来模拟递归中的数据!

想要拿到高薪,就要有实力,如何让别人觉得你有实力,就是你写代码的能力和写代码的速度,反应速度。多多练习才是王道。

比如说面试官让你求任意一个整数有多少位的for,while,go..while,goto,递归实现在10分钟以内实现,就能考察你的代码能力。

 

求任意一个整数有多少位的for,while,go..while,goto,递归实现


wei++;for (; num; num /= 10){wei++;}while (num){wei++;num /= 10;}do {wei++;num /= 10;}while (num);AAA:if (num){num /= 10;wei++;goto AAA;}


5050-100-99-98-....-1  for,while,do...while,goto,递归实现

int Reduce(int sum, int n){if (n == 0)return sum;else{return Reduce(sum-=n, n - 1);}}


下面是求二叉树叶子结点的个数的递归算法,注意使用全局变量和使用函数传参的方式保存叶子结点个数的异同。要特别掌握第二种递归的用法!


 

int sum = 0;int DLR_CountLeafNum(BiTNode *root)//采用中序遍历的递归算法{ if ( root)  //非空二叉树条件,还可写成if(root !=NULL ){   if(!root->lchild && !root->rchild)  //是叶子结点则统计并打印{   sum++;     printf("%c\n",root->data);  }DLR_CountLeafNum(root->lchild); //递归遍历左子树,直到叶子处;DLR_CountLeafNum(root->rchild);//递归遍历右子树,直到叶子处;}return(0);  } int DLR_CountLeafNum2(BiTNode *root, int *psum)//采用中序遍历的递归算法{ if ( root)  //非空二叉树条件,还可写成if(root !=NULL ){   if(!root->lchild && !root->rchild)  //是叶子结点则统计并打印{   (*psum) ++;     printf("%c\n",root->data);  }DLR_CountLeafNum2(root->lchild, psum); //递归遍历左子树,直到叶子处;DLR_CountLeafNum2(root->rchild, psum);//递归遍历右子树,直到叶子处;}return(0);  }

阿里巴巴面试题 用递归判断一个数组是否是递增数组

bool test1(int arr[], int n){if (n == 0)return true;return test1(arr, n - 1) && arr[n]>arr[n - 1];}bool test2(int arr[], int n){if (n == 1)return true;else if (n == 2)return arr[n-1] > arr[n-2];elsereturn test2(arr, n - 1) && arr[n-1] > arr[n - 2];}//由斐波那契数列引出的面试题,跳台阶//一次可以调1级,2级,3级int step(int nStep){if (1 == nStep)return 1;else if (2 == nStep)return 2;else if (3 == nStep)return 4;elsereturn step(nStep - 1) + step(nStep - 2) + step(nStep - 3);}//一次可以调1级,2级int taijie(int n){if (1 == n)return 1;else if (2 == n)return 2;elsereturn taijie(n - 1) + taijie(n - 2);}


0 0