# 栈改递归

这个问题，距今有3年多了。不过我自己早就忘了，以前的工程也找不到了。只好自己重新新写。本以为是个很容易的问题。实际上却花了3个多小时。

/*-------------------------------------------------------------------
http://topic.csdn.net/t/20030118/19/1372004.html
算法问题（栈改递归其它非递归方法也可！！）
liuxk99 (极地狐)     2003-01-18 19:32:13 在 C/C++ / C语言 提问
非递归算法实现一个函数.
f = n; (m <= 1)
f = m; (n <= 1)
f = f(m - 1, n) + f(m, n - 1); (m > 1, n > 1)
-------------------------------------------------------------------*/
#include "stdio.h"
#include "string.h"

#include "windows.h"

#define TRUE      1
#define FALSE    0
#define STACK_SIZE 1000

typedef struct _st{
int m;
int n;
int bLeft;
int bRight;
int fpos; // 父节点
}st;

int f(int m, int n)
{
if (m <= 1)
return n;
else if (n <= 1)
return m;
else
return f(m - 1, n) + f(m, n - 1);
}

int fs(int m, int n)
{
int res = 0;
st stk[STACK_SIZE];
int pos = 0, x, y, lspos;
memset (&stk, 0, sizeof(stk));
stk[pos].m = m;
stk[pos].n = n;
stk[pos].bLeft = FALSE;
stk[pos].bRight = FALSE;
lspos = pos;

while (1)
{
if (stk[0].bLeft && stk[0].bRight)
break;

printf(("/r/nstack :"));
for (int i = 0; i <= pos; i++)
{
printf (" (%d, %d)", stk[i].m, stk[i].n);
}
// get stack top
x = stk[pos].m;
y = stk[pos].n;

if (x <= 1)
{
lspos = stk[pos].fpos;
res += y;
stk[lspos].bLeft = TRUE;
printf ("/r/n%02d.Pop(%d, %d)", pos, stk[pos].m, stk[pos].n);
--pos; // pop stack
//printf(("/r/nfs(%d, %d) = %d", x, y, res);
}
else if (y <= 1)
{
lspos = stk[pos].fpos;
res += x;
stk[lspos].bRight = TRUE;
printf ("/r/n%02d.Pop(%d, %d)", pos, stk[pos].m, stk[pos].n);
--pos; // pop stack
}
else
{
// pop stack
if (stk[pos].bLeft && stk[pos].bRight)
{
lspos = stk[pos].fpos;
if (pos - lspos == 1) // 分支判断
stk[lspos].bLeft = TRUE;
else
stk[lspos].bRight = TRUE;
printf ("/r/n%02d.Pop(%d, %d)", pos, stk[pos].m, stk[pos].n);
--pos;
}
else
{
lspos = pos;
// push stack
printf ("/r/n%02d.Push(%d, %d)", pos, x - 1, y);
++pos;
stk[pos].m = x - 1;
stk[pos].n = y;
stk[pos].bLeft = FALSE;
stk[pos].bRight = FALSE;
stk[pos].fpos = lspos;

printf ("/r/n%02d.Push(%d, %d)", pos, x, y - 1);
++pos;
stk[pos].m = x;
stk[pos].n = y - 1;
stk[pos].bLeft = FALSE;
stk[pos].bRight = FALSE;
stk[pos].fpos = lspos;
}
}
}

return res;
}

int main(int argc, char* argv[])
{
int m = 5, n = 4, res = 0;

DWORD tc1, tc2;
tc1 = GetTickCount ();
res = f(m, n);
tc2 = GetTickCount ();
printf ("%d : f(%d, %d) = %d/r/n", tc2 - tc1, m, n, res);

tc1 = GetTickCount ();
res = fs(m, n);
tc2 = GetTickCount ();
printf ("%d : f(%d, %d) = %d/r/n", tc2 - tc1, m, n, res);

return 0;
}

• 本文已收录于以下专栏：

## 数据结构之栈与递归

• 2013年07月17日 15:15
• 1KB
• 下载

## 栈递归.rar

• 2013年10月11日 20:14
• 2KB
• 下载

## 八皇后问题（可改为N皇后）递归

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm...

## java递归的排序和查找，数组栈.....

• 2010年06月04日 13:05
• 227KB
• 下载

## 栈和递归的实现

• 2016年11月18日 22:51
• 75KB
• 下载

## 数据结构\数据结构全部课件\第二章线性表3_栈与递归 课堂练习答案.doc

• 2010年08月15日 10:19
• 27KB
• 下载

## c++栈与递归

• 2012年03月15日 16:14
• 272KB
• 下载

## C++ 递归 输出所有出栈方案

• 2011年10月05日 17:53
• 2KB
• 下载

举报原因： 您举报文章：栈改递归 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)