这是我的第一个问题,所以要善良:-)我正在尝试在这里进行递归调用,但是我得到以下编译器错误:
In file included from hw2.cpp:11:
number.h: In member function ‘std::string Number::get_bin()’:
number.h:60: error: no matching function for call to ‘Number::get_bin(int&)’
number.h:27: note: candidates are: std::string Number::get_bin()
string get_bin ()
{
bin = "";
printf("Value is %i\n",val);
if (val > 0)
{
int remainder = val;
printf("remainder is %i\n",remainder);
printf("numbits is %i\n",size);
for (int numbits = size-1;numbits>=0;numbits--)
{
//printf("2 raised to the %i is %i\n",numbits,int(pow(2,numbits)));
printf("is %i less than or equal to %i\n",int(pow(2,numbits)),remainder);
if (int (pow(2,numbits))<=remainder)
{
bin+="1";
remainder -= int(pow(2,numbits));
printf("Remainder set to equal %i\n",remainder);
}
else
{
bin+= "0";
}
}
return bin;
}
else
{
int twoscompliment = val + int(pow(2,size));
return get_bin(twoscompliment);
}
有什么想法?我知道get_bin适用于正数。
答案 0 :(得分:2)
在最后一行中,您使用整数引用参数调用get_bin()
,但函数签名中没有正式参数。
答案 1 :(得分:2)
string get_bin ()
return get_bin(twoscompliment);
这些是互不相容的。我不知道你怎么能说代码适用于正数,因为它甚至没有编译。
您可能需要将第一行更改为:
string get_bin (int x)
但是,由于你实际上没有使用参数,你可能还有其他问题。
如果你正在使用全局变量或对象级变量来完成这项工作,那么递归就不会起作用,因为它们不同的层次将相互踩踏(除非你做拥有栈)。
递归的优点之一是您的代码可以小巧而优雅,但使用局部变量对于确保数据特定级别至关重要。
举例来说,检查以下(写得不好)的伪代码:
global product
def factorial (n):
if n == 1:
return 1
product = factorial (n-1)
return n * product
现在这对factorial (7)
无效,因为product
会被较低级别损坏。但是,像:
def factorial (n):
local product
if n == 1:
return 1
product = factorial (n-1)
return n * product
会很好地工作,因为每个级别都会获得自己的product
副本。当然:
def factorial (n):
if n == 1:
return 1
return n * factorial (n-1)
会更好。
答案 2 :(得分:0)
该函数被定义为不带参数,但是你传递了int
。
看起来您正在访问全局或成员变量val
。这应该可以转换成参数。
string get_bin ( int val )
答案 3 :(得分:0)
由于你没有在函数中声明bin
和val
,我猜它们是全局的。
现在定义函数get_bin()
以返回字符串而不接受任何内容。但是在递归调用中,你传递的是int
。由于您希望将twoscompliment
作为val
传递给递归调用,您可以这样做:
int twoscompliment = val + int(pow(2,size));
val = twoscompliment; // assign twoscompliment to val
return get_bin();