关闭

递归入门(十) ---- 打印数字(递归原理详解)

标签: 递归
1339人阅读 评论(0) 收藏 举报
分类:

递归的原理:

对于递归来说,建议大家先去学习栈,然后再来看这篇博客更有意义。

大多数对于递归的解释是,自己调用自己。书面很不好懂,我的前几篇递归系列的博客已经有写几个例子,

但是感觉也不是很适合基础,这里来细讲一下。


递归的底层实现其实是一个栈.栈的特点是后进先出,

也就是最后进入栈的事件是最先被处理的.


例如计算n!

  n *  f(n-1)                                                                     然后f(n - 1)待解决,那么进入下一行  入栈

  n * n - 1 *f(n-1)                                                            然后f(n - 1)待解决,那么进入下一行  入栈

  n * n - 1 * n -2 * f(n-1)                                                 然后f(n - 1)待解决,那么进入下一行  入栈

 ........

...................

........................直到

f(n - 1) = 0时候,不执行了,那么f(n-1) = 0前面的就是: 分别从 1 2 3 4 ......分别出栈,然后计算就是

n * (n - 1) * (n - 2) * (n - 3) * .................... 3 * 2 * 1 = n!

各位懂了吗?


举个例子:


打印数字,利用递归形式打印

           1

           2 2

           3 3 3


代码如下:

<span style="font-size:18px;">//杨鑫
#include <stdio.h>
void print(int w)
{
	int i;
	if(w != 0)
	{
		print(w - 1);
		for(i = 1; i <= w; i++)
		{
			printf("%3d", w);
		}
		printf("\n");
	}
}
int main()
{
	print(3);
	return 0;
}</span>


结果如图:




分析:


这里递归的过程:


应该是3先进来,然后没有执行,

然后变成2,然后也没有执行,

然后变成1,然后也没有执行,

然后是0,不满足,

然后返回时1,执行,

然后是返回2,执行,

然后是返回3,执行

最终答案:

1

2 2

3 3 3


各位懂了吗?

1
0
查看评论

递归关键问题(以递归循环打印1~9为例)

递归的两个关键问题是: 1.出口问题,即什么时候结束; 2.逻辑相似性。 这与循环很相似: for(int i=0;i<10;i++){ system.out.println(i); }循环中“i for(int i=0;i<10;){ system.out.printl...
  • phs999
  • phs999
  • 2017-04-30 09:46
  • 162

递归回溯打印全排列(两种方法求解)

打印全排列问题:给定一个数n,要求打印123...n的所有全排列.例如n=4,则所有的全排列为: 1 2 3 4 1 2 4 3 1 3 2 4 1 3 4 2 1 4 2 3 1 4 3 2 ...... 4 1 2 3 一共4!=24个. ————————————————————————————...
  • ten_sory
  • ten_sory
  • 2017-03-30 23:05
  • 487

递归画图形

问题讲解首先,我觉得这一类题都是一个套路,让我们来先认识一下:一般递归画图形这种题目,都是先给你一个原始图形(最简单的),然后让你在这个图形的周围画出和它一样的图形,随着层数增加,图形会成指数倍增加,例如:输入n, 当n==1时:o当n==2时: o ooo o当n==3时: o o...
  • u013647382
  • u013647382
  • 2016-10-07 23:15
  • 1323

【递归输出图形】POJ_1941

The Sierpinski Fractal Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4720   Accepted: 1...
  • yiluuuuu
  • yiluuuuu
  • 2017-06-11 20:29
  • 257

递归使用案例:输出对称图形

要求:在控制台下输出如下图形        1      121   12321 1234321        1      121  ...
  • ComTNT
  • ComTNT
  • 2016-11-06 22:46
  • 326

递归打印实数

问题1:  只使用处理I/O的printDigit函数编写一个过程以输出任意整数(可以是负数)。   解决:使用递归解决该问题 代码: 头文件 #include /*打印出一个数字*/ void printOut(int n) { /...
  • fuzhengchao
  • fuzhengchao
  • 2012-06-05 16:27
  • 2887

递归大总结之打印大数1-n

递归 #include using namespace std; void PrintfNumber(char num[]) { bool isBegin0 = true; int nlength = strlen(num); for (int i = 0; i < nlength; ...
  • gjggj
  • gjggj
  • 2017-03-08 21:21
  • 346

递归3_计算多个数字

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. printf("sum = %d&q...
  • li1990101010
  • li1990101010
  • 2016-03-31 14:03
  • 113

用递归打印数字

题目描述:用递归的方法找到从1到最大的N位整数。 样例: 给出 N = 1, 返回[1,2,3,4,5,6,7,8,9]. 给出 N = 2, 返回[1,2,3,4,5,6,7,8,9,10,11,...,99]. 题目要求用递归的方法。那就先来看一下,当N =...
  • guoziqing506
  • guoziqing506
  • 2016-09-01 10:33
  • 591

LintCode 用递归打印数字

中等 用递归打印数字 24% 通过 用递归的方法找到从1到最大的N位整数。 您在真实的面试中是否遇到过这个题?  Yes 样例 给出 N = 1, 返回[1,2,3,4,5,6,7,8,9]....
  • susser43
  • susser43
  • 2015-07-02 10:08
  • 1000
    个人资料
    • 访问:1602634次
    • 积分:29229
    • 等级:
    • 排名:第211名
    • 原创:1389篇
    • 转载:21篇
    • 译文:8篇
    • 评论:220条
    Social NetWork
    博客专栏
    最新评论