【问题标题】:How to determine two functions are cloned without comparing their outputs and signatures?如何确定两个函数被克隆而不比较它们的输出和签名?
【发布时间】:2017-03-11 10:10:17
【问题描述】:
int factorial ( int n )
{
   if ( n == 0)
      return 1;
  else
      return n * factorial (n -1);
}

上面的函数和下面的函数执行相同的功能。实现相同功能的语法不同的代码片段称为 Type-4 代码克隆。它们也被称为语义或功能克隆

 int factorial ( int n )
{
   int i , fact =1;
   for ( i =1; i <= n; i ++)
       fact = fact * i ;
   return fact;
}

现在,我的问题是如何在不比较它们的输出和签名的情况下确定这两个函数是否被克隆?

【问题讨论】:

  • 好吧,它们并不是真正的克隆,因为它们都以完全不同的方式实现相同的功能。
  • 绝对没有办法做到这一点
  • 它们不是相互克隆的,它们只是提供相同的输出,但实现不同。
  • 整个博士论文或像 TeamScale 这样的复杂产品都是围绕这些问题构建的。不要假设一个简单的 SO 问题就可以涵盖这一点。太宽泛了。
  • 唯一希望:解释为什么不能这样做:-)

标签: java function methods analysis


【解决方案1】:

你根本做不到。

假设第一个方法在特定输入上停止。

为了找到符合您定义的“克隆”,您必须查找程序的任何其他部分是否在任何输入时停止。

换句话说,您必须解决停机问题。 正如您希望知道的那样,这个问题无法解决。

【讨论】:

  • 严格来说,停机问题只能告诉我们,没有程序可以对所有可能的输入(即所有函数对)给出正确答案。理论上,可以编写一个适用于某些输入的代码。
  • 我也不确定。但我认为:最后他要求找到“做同样事情”的任何两种方法;没有专门查看任何特殊的输入值。从这个角度来看,我发现我的答案是一个深刻的论点,即这个要求无法解决。
猜你喜欢
  • 1970-01-01
  • 2012-06-04
  • 2013-06-10
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多