由易到难学习递归的精华

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


以上是关于由易到难学习递归的精华的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程由易到难

thrift开发笔记(4种由易到难的匹配系统)

本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

02. 爬取get请求的页面数据

正确理解c和c ++的复杂类型声明

转:如何理解c和c ++的复杂类型声明