使用带有一个参数函数的递归查找数字的平方[关闭]

Posted

技术标签:

【中文标题】使用带有一个参数函数的递归查找数字的平方[关闭]【英文标题】:Find the square of a number using recursion with one parameter function [closed] 【发布时间】:2018-09-03 16:24:21 【问题描述】:

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

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

你的工作:编写一个同样返回 n2 的函数,但有以下限制:

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

但是,……

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

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

【问题讨论】:

提示:n^2 == (n-1)^2 + n + n - 1 显示失败的代码。 这是一个有趣的问题,但它显然也有点像家庭作业转储(这就是为什么它被否决了很多)。虽然您到目前为止解释了您的工作,但该练习及其解决方案对其他人几乎没有实际用途(除非他们必须解决完全相同的作业),因此对于 *** 来说这不是一个真正的好问题。 @drescherjm 我看不出添加明显违反约束之一的代码如何有助于改善问题。真正的答案并不像有很多步法,它实际上是单行的,因此向它迭代现有代码是行不通的。 【参考方案1】:

为了将平方运算实现为递归函数,首先需要将运算用自身来表达:

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

那么,为了避开运营商*

2n = n + n

因此,n2 = (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 是 基本情况(即,当递归停止时)。对于这种情况,它返回零,因为 02 为零。

【讨论】:

以上是关于使用带有一个参数函数的递归查找数字的平方[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用参数递归的数字阶乘(如参数列表中的函数调用)

实验2 递归和分治法(二分查找)

R语言递归函数示例(Recursive Functions):使用递归函数计算阶乘使用递归函数计算数据序列的平方和

递归函数,查找给定数字内的偶数或奇数

用于查找数字的阶乘的递归函数

使用递归函数查找数组的最小数量