题2、请给出此题的非递归算法:
【中国著名门户网站企业S公司2008年6月面试题】
解析:
本题类似于杨辉三角形,其实就是计算一个对角线值,用list保存一个对角线元素即可。除了横边和纵边按顺序递增外,其余每一个数是它左边和上边数字之和。
1, 2, 3, 4, 5
2, 4, 7, 11, 16
3, 7, 14, 25, 41
5, 16,41, 91, 182
如上所示,假如想求m为3、n为4的f(m,n)值,就是25。
答案:
// P84_example2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#define RECURSION 0 //递归标记
#define NO_RECURSION 1 //非递归标记
//==========递归版本=========//
#if RECURSION
unsigned long f(int m, int n)
{
if(1 == m)
{
return n;
}
if(1 == n)
{
return m;
}
return f(m-1,n)+f(m,n-1);
}
#endif
//==========非递归版本=========//
#if NO_RECURSION
unsigned long f(int m, int n)
{
unsigned long a[100][100]; //100*100的列阵
//当m=1 或n=1时单独赋值
for(int i = 0; i != m; ++i)
{
a[i][0] = i + 1;
}
for(int i = 0; i != n; ++i)
{
a[0][i] = i + 1;
}
//其他元素
for(int i = 1; i != m; ++i)
{
for(int j = 1; j != n; j++)
{
a[i][j] = a[i - 1][j] + a[i][j - 1];
}
}
return a[m-1][n-1];
}
#endif
int _tmain(int argc, _TCHAR* argv[])
{
std::cout<<f(10,10)<<std::endl;
return 0;
}