由易到难学习递归的精华

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

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


你可能感兴趣的:(编程,算法,面试,递归算法)