使用带有一个参数函数的递归来找到数字的平方

时间:2018-09-03 16:24:22

标签: c++ algorithm recursion

下面是一个(简单的)C ++函数,该函数返回其参数的平方(一个非负整数):

unsigned int square(unsigned int n) {
    return n*n;
}

您的工作:编写一个函数,该函数还返回n 2 ,但具有以下约束:

  • 您不能使用乘法运算符*
  • 您不能使用除法运算符/
  • 您不能有任何循环
  • 您不能向该函数添加任何其他参数
  • 您的功能必须是独立的:没有辅助功能!
  • 您不能使用任何全局变量
  • 您不能使用任何静态变量
  • 您不能使用任何“位旋转”操作-不能进行移位等。

但是,...

  • 您可以使用递归
  • 您可以使用+-运算符。

到目前为止,我已经尝试使用n(n + n + n + ...)求平方,但是为此,我需要一些可以跟踪递归循环的东西,但是由于该函数只能具有一个我需要的参数解决这个问题的另一种方法。

1 个答案:

答案 0 :(得分:3)

为了将平方运算实现为递归函数,您需要首先根据自身来表示该运算:

(n-1) 2 = n 2 -2n +1 --> n 2 =(n-1) 2 + 2n-1

然后,为了避免使用运算符*

2n = n + n

因此, n 2 =(n-1) 2 + n + n-1


考虑到这一点,您可以轻松地将square()实现为不使用运算符*递归函数

unsigned int square(unsigned int n) {
   if (n == 0)
      return 0; // base case

   return square(n-1) + n + n - 1; // recursive case
}

或者仅使用三元运算符 unsigned int square(unsigned int n) { return n? square(n-1) + n + n - 1: 0; }

n等于零是基本情况(即递归停止时)。在这种情况下,由于0 2 为零,因此它返回零。