由易到难学习递归的精华

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

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

由易到难学习递归的精华

时间: 2024-10-02 01:58:19

由易到难学习递归的精华的相关文章

学习递归时,影响到的一个算法问题

当年学习递归,有一个例子是 1,1,2,3,5,8,13......这样求第N个数的值. 当时还颇为认同其递归的巧妙. 后来去携程面试,还被问到,心里暗爽,这不是送分吗.俩分钟再小黑板上写出了递归的实现,被瑞亮总给分析了说是个O(n*n).还觉奇怪,为啥点了下这个 今天温习算法时,看到关于深度搜索和宽度搜索时,想到这个题目,重新思考了下.顿时觉得当时面试时,瑞亮总当时给留了面子. 下边是今天想到的O(N)的实现方法. int n =7; ArrayList<Integer> list = ne

继续Perl学习 递归

有一段时间学习PYTHON,很伤心啊,版本太新,好多东西用起来不方便. 还是继续用我的小***perl吧,我相信perl会解决掉我遇到的大部分问题! 一.统计随机数出现频次 --源代码 --- 结果显示 二.递归应用,阶乘算法 --代码 -- 结果

算法学习 - 递归与非递归,位运算与乘除法速度比较

递归调用非递归调用 运行时间比较 结论 位运算与乘除法 结论 递归调用/非递归调用 我们都知道,很多算法,都是用递归实现的.当然它们同时也是可以用非递归来实现. 一般我们在对二叉树进行遍历的时候,还有求斐波那契数的时候,递归是非常简单的.代码容易懂,好实现. 但是递归的时候,有一个问题,就是需要压栈.为什么要压栈呢?因为当我在函数内部调用自身的时候,要中断当前的操作继续跳转到下一次的实现,而当前运行的状态要保存起来.所以就把当前状态进行压栈,等到运行到递归条件结束的时候,再弹栈. 所以递归就是需

算法学习——递归

递归算法是把问题转化为规模缩小了的同类问题的子问题.然后递归调用函数(或过程)来表示问题的解. 一般来说 ,能够用到递归解决的问题应该满足以下三个条件: (1)待解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题相同,只是在数量规模上会有所不同: (2)递归调用的次数必须是有限的; (3)必须有结束递归的条件来终止递归. 以下是一些用到递归的简单实例: eg_Fibonacci数列: int Fib(int n) { if(n==1||n==2) return (1);

算法学习---递归

//递归之Hanoi塔问题 #incude<iostream> using namespace std; void hanio(int a,int b,int c,int n) { if(n>0) { hanoi(n-1,a,c,b); //表示将塔座a上自上而下,由大到小叠在一起的n个圆盘 依移动规则移至塔座b上并仍按 同样顺序叠排 move(n,a,b); //表示将塔座a上编号为n的圆盘移动到塔座b上 hanoi(n-1,c,b,a); } } //递归之整数划分问题 int q(

[Lua学习]递归求阶乘

1 --递归求阶乘 2 function func(n) 3 if n ~= 1 then 4 return n * func(n - 1) 5 else 6 return 1 7 end 8 end 9 10 print("输入整数:") 11 a = io.read("*number") 12 print(a .. "! -> " .. func(a)) ps:函数内也可以用(a and b) or c 这种形式的语句替代(未亲测).

python学习(递归)

一. 递归 递归就是函数自己调用自己 python中递归最大可用深度是997 递归可以用来遍历各种树形结构 #用递归方法查看某一个路径内的文件内容 import os filepath = 'd:\资料下载' #要打开的文件路径 def read(filepath,n): #n为递归深度,也就是用来控制缩进的数量 it = os.listdir(filepath) #按照给出的文件路径打开文件, 返回的it是一个可迭代对象 # print("__next__"in dir(it)) #

算法学习——递归之排队购票问题

算法描述 一场球赛开始前,售票工作正在紧张的进行中.每张球票为50元,现有m+n个人排队等待购票,其中有m个人手持50元的钞票,另外n个人手持100元的钞票.假设开始售票时售票处没有零钱,求出m+n排队购票, 算法思路 定义函数f(m,n)表示m个人手持50元,n个人手持100元共有的排队种数 当n=0,没有手持100元的人排队,这个情况是找得开钱 f(m,0) =1 当m<n,(手持50元的人数小于手持100元的人数) f(m,n)=0 其他情况 当第m+n个人手持100元,他之前的m+n-1

学习递归循环

 #include <iostream>       using namespace std;   /* 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. */   //0 1 2 3 //f(n) = (最后一次跳一级台阶有多少种方法) + (最后一次跳两级台阶有多少种方法) //即: //f(n) = f(n - 1) + f(n - 2) class Solution  { public:  int jumpFloor(int numb