【面试题】剑指Offer-46-从1加N

题目概述


解题思路

这道题目不能用循环,同时呢,禁用了if等判断语句表示也不可以用递归求解

这道题目考的是对C++语法内容的熟练程度

这道题目可以从构造函数,虚函数,函数指针以及模板求解

方法1:利用构造函数求解

我们可以定义一个类,类有两个静态的成员,一个N,一个Sum

并初始化为0

每当调用构造函数时,N++,然后用Sum加上当前的N值

如此,当我们需要加到X时,便可以生成X个对象

然后获取类内部的Sum值即可

构造函数方法的代码实现

//方法1:利用构造函数
class A
{
public:
	A()
	{
		++N;
		Sum += N;
	}

	static int GetNum()
	{
		return Sum;
	}
public:
	static int N;
	static int Sum;
};

int A::N = 0;
int A::Sum = 0;

void TestGetValueByConStruct()
{
	A* pa = new A[5];
	cout << A::GetNum() << endl;
}

方法2:利用虚函数进行求解

利用虚函数的主要思路是,让A类的fun成员函数扮演着递归条件终止的角色

让A类的派生类B类中的虚函数fun扮演递归的角色

定义A类的数组Array[2],分别指向一个A类,B类对象

通过判断是否加到N来决定调用哪个类的fun函数

//方法2
//利用虚函数求解
class AA;
AA* Array[2];

class AA
{
public:
	virtual size_t Sum(size_t n)
	{
		return 0;
	}
};

class BB :public AA
{
public:
	virtual size_t Sum(size_t n)
	{
		return Array[!n]->Sum(n-1) + n;
	}
};

int GetValueByVirtual(size_t n)
{
	AA a;
	BB b;
	Array[0] = &b;
	Array[1] = &a;

	int value = Array[0]->Sum(n);
	return value;
}

void TestGetValueByVirtual()
{
	cout << GetValueByVirtual(5) << endl;
}

方法3:利用函数指针进行求解

大体的思路和虚函数是类似的,定义一个函数指针pfun

定义两个函数,一个控制递归的结束

一个控制递归的相加

定义函数指针数组,分别指向两个函数即可

//方法3
//函数指针求解

typedef size_t (*pfun)(size_t n);

size_t FunPointer1(size_t n)
{
	return 0;
}

size_t FunPointer2(size_t n)
{
	pfun pF[2] = { FunPointer2, FunPointer1};
	return pF[!n](n-1) + n;
}

size_t GetValueByFunPointer(size_t n)
{
	return FunPointer2(n);
}

void TestGetValueByFunPointer()
{
	cout<< GetValueByFunPointer(5) << endl;
}

方法4:用模板进行求解

这里呢,我们可以用到特化来判断递归的终止条件

思路也很简单

//方法4:用模板类型求解
template<size_t N>
size_t F()
{
	return N + F<N - 1>();
};

template<>
size_t F<1>()
{
	return 1;
};

void TestGetValueByTemplate()
{
	cout << F<5>() << endl;
}




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值