码迷,mamicode.com
首页 > 其他好文 > 详细

动手动脑2

时间:2017-10-14 01:42:48      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:出栈   ret   最大的   转移   ++   int   col   使用   计算   

首先,如果做的听的递归的题目多了之后,就会发现,递归要满足两个条件:

一是,要有使递归进行下去的变量,在这里就是row和col(行和列);

二是,要有终止递归的条件,在这里就是当row和col相等或者col==1的时候。

递归在经典的问题中用到很多,下面写几个问题的伪程序:
#include<iostream>
using namespace std;
#define max 10
/*下面定义的这个数组本来是要递归一遍直接记录在数组里面的,而不用每求一个再去递归,但是这道题不大使用,因为在if条件里面有一个return,
如果改的话,就直接计算了,可以不用递归了,所以这里算是强行用一波递归吧嘿嘿嘿*/
int print[max][max] = { 0 };

int digui(int row, int col) {
if (col == 0 || row == col) {
print[row][col] = 1;
return 1;
}
else {
return digui(row - 1, col - 1) + digui(row - 1, col);//这个的值就是前面的两个数相加得来
}
}

void main() {
for (int _row = 0; _row < max; _row++) {
for (int _col = 0; _col <= _row; _col++) {
printf("%5d", digui(_row, _col));
}


printf("\n");


汉诺塔

题意:把a上的num个轮盘通过b移动到c上,这num个罗盘大小均不相同,规则是:大罗盘必须在小轮盘上面
/*这里的num是罗盘的数量,a是罗盘最初在的杆,b是借用实现转移的杆,c是罗盘最终要移动到的杆*/
hanota(num,a, b, c) {
if (num == 1)
move(1,a, c);
else {
hanota(num - 1, a, c, b);//把num-1个罗盘移动到b上
move(num, a, c);//把最大的罗盘移动到c上
hanota(num - 1, b, a, c);//把num-1个罗盘移动到c上
}
}
}
}

首先应该知道函数时保存在栈中的,当调用函数调用一个被调用函数的时候,就将这个被调用函数压入栈中,并且保存这个函数的“状态“(包括实参等)最后入栈的是调用函数的返回地址,当这个函数执行的时候,调用函数的自变量又被压入栈中。当前面的被调用函数有调用函数的时候,就会继续压栈。所以递归不能无限执行,会溢出。当这个函数执行完的时候,就会被弹出栈,接着执行下一个函数,这里的如何找到下一个函数,是通过一个地址指针。

动手动脑2

标签:出栈   ret   最大的   转移   ++   int   col   使用   计算   

原文地址:http://www.cnblogs.com/gaogege/p/7664231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!