试图用C ++进行递归调用

时间:2010-09-17 06:38:43

标签: c++ recursion

这是我的第一个问题,所以要善良:-)我正在尝试在这里进行递归调用,但是我得到以下编译器错误:

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适用于正数。

4 个答案:

答案 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)

由于你没有在函数中声明binval,我猜它们是全局的。

现在定义函数get_bin()以返回字符串而不接受任何内容。但是在递归调用中,你传递的是int。由于您希望将twoscompliment作为val传递给递归调用,您可以这样做:

int twoscompliment = val + int(pow(2,size));
val = twoscompliment; // assign twoscompliment to val
return get_bin();