由易到难学习递归的精华
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由易到难学习递归的精华相关的知识,希望对你有一定的参考价值。
以下是收集的一些递归实现的小算法,勤加练习,相信每个人都能对简单的递归驾驭自如!
从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]; else return 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; else return 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; else return taijie(n - 1) + taijie(n - 2); }
以上是关于由易到难学习递归的精华的主要内容,如果未能解决你的问题,请参考以下文章
本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)