从(0,0)到(m,n),每次走一步,只能向上或者向右走,有多少种路径走到(m,n)
来自腾讯的面试题。
主要是要把递归的流程分析清楚,这个问题就是一个二叉树DFS类似的问题,判断稍微复杂,每步都只能往两个方向走,右或者上,
截止条件是:0==m&&0==n
输出存储的路径,并且将total计数加1。
如果m<0||n<0
返回
否则分别走两条路:n-1,m-1
对比我原来的逻辑:
这样的话我会在第一次输出之后,m,n==0,先进入2方向分支,n-1,然后不断地进入2方向分支,进入死循环最终导致stack overflow。
扫描二维码关注公众号,回复:
8534107 查看本文章
我应该判断m,n是否超出边界,超出则返回,与DFS到达空指针的地方返回一样。
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
//10000时发生stackoverflow
typedef struct Coordinate
{
int x;
int y;
}Coordinate;
#include "func.h"
Coordinate R[MAX];
int index = 0;//栈顶指针
int total = 0;//计数总共走的方法数量
void PrintStack(Coordinate R[], int index)
{
int i;
for (i = index; i>0; --i)
{
printf("%d.%d-->", R[i].x, R[i].y);
}
printf("%d.%d", R[i].x, R[i].y);
}
void Coordinate_Recursion(int m, int n,int index)
{
R[index].x = m;
R[index].y = n;
if (0 == m && 0 == n)
{
++total;
PrintStack(R, index);
printf("%5d\n", total);
}
if (m < 0 || n < 0)
return;
Coordinate_Recursion(m - 1, n,index+1);
Coordinate_Recursion(m, n - 1,index+1);
}//Coordinate_Recursion
int main(void)
{
int m, n;
while (scanf("%d %d",&m,&n)!=EOF)
{
memset(R, -1, MAX * sizeof(Coordinate));
Coordinate_Recursion(m, n,index);
total = 0;
}
system("pause");
}