今天去爱立信面试,面试官给我出的 C 算法问题。大家来看看!
举例:对于一个2*2的二维数组,从[0,0]位置走到[1,1]位置有两种路线。(注:所有移动只能是向右‘→’方向或者向下‘↓’方向)对于一个3*2的二维数组,从[0,0]位置走到[2,1]位置有三种路线。(大家可以自己画一画就知道了)
对于一个3*3的二维数组,从[0,0]位置走到[2,2]位置有六种路线。
问题:对于一个m*n的二维数组,m和n不一定相等。从[0,0]位置走到[m-1,n-1]位置有多少种路线?
编写函数 int f(m,n) 返回路线数。
给我十分钟的时间,我只想出一个算法出来,没写出真正的程序。并且算法比较简单,面试官说我的算法效率太低。
各位有没有什么高见,说一说这个算法怎么写好
f(m,1) = 1
f(1,n) = 1
f(m,n) = f(m-1,n) + f(m,n-1)
当然了,你别用递归。
#include<stdio.h>
int f(int m,int n)
{
if(m==0||n==0)
return 1;
else
return f(m-1,n)+f(m,n-1);
}
int main()
{
int m,n;
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
printf("%d*%d的矩阵的路线共有:%d条!\n",m,n,f(m-1,n-1));
return 0;
}
自己在.Net环境下进行测试过