【问题标题】:Base conversion using recursion使用递归进行基本转换
【发布时间】:2013-09-16 20:39:42
【问题描述】:

我正在处理一项任务并已部分解决。 目前我得到了正确的输出,只是相反。

这是我实现的辅助函数:

char int2char (int radix, int value) {

    char c = '?';

    if ((value >= 0 && value < radix) && (radix <= 36 && radix >= 2)){
        if (value < 10){
            c = value + 48;
        }
        else if (value >= 10 && value < 36) {
            c = value + 55;
        }   
    }

    return c;
}

到目前为止,我遇到困难的实际功能是这样的:

void int2str (int radix, int value) {

    int result = value % radix;
    int division = value / radix;
    char c;

    c = int2char(radix, result);
    putchar(c);

    while (division > 0) {
        return int2str(radix, division);
    }

}

第一个函数用于以十六进制表示数字 10-35。因此,例如,如果模数产生 11,我应该输出“B”。

这很好用,除了倒退!而且我不知道如何扭转它。最大的障碍是您只能使用 putchar() 作为输出。没有字符串,没有数组。

为了进一步澄清,如果我输入:

int2str 16 60

输出应该是'3C',而不是我得到'C3'。

【问题讨论】:

  • 如果在 putchar() 之后 flush() 会发生什么?

标签: c recursion


【解决方案1】:

首先,您对while 的使用令人困惑,因为其中有一个return。将其替换为 ifreturn 是不必要的,因为函数最后会自行返回。

完成此操作后,您可以通过在递归调用后移动 putchar 来反转输出:

if (division > 0) {
    int2str(radix, division);
}

putchar(c);

附带说明,return int2str(radix, division); 在这个函数中无论如何都没有意义,因为它是一个 void 函数,所以没有什么可以返回。如果你确实想要这样做(在这种情况下你不想这样做),你会说:

somefunction();
return;

此外,如果您使用 '0''A' 而不是 48 和 55,这可能会更清楚:

    if (value < 10){
        c = value + '0';
    }
    else if (value >= 10 && value < 36) {
        c = value - 10 + 'A';
    }   

【讨论】:

  • 我也是这么想的,只有这样我才得到'3',没有别的了。这就是我如此困惑的原因?在递归函数中,我在递归调用之前/之后简单地移动 print 语句将反转输出。在这里它只打印最后一次完成的模数运算。
  • @shparkison 令人困惑的部分是你不必要的return。试试这个更新版本。
  • @shparkison 有关他发布的旁注的更多信息,请阅读以下内容的最佳答案:stackoverflow.com/questions/3383090/…
  • 这就是我所需要的。感谢布伦丹的提醒。绝对是回报搞砸了事情。
【解决方案2】:

result 是最后一个数字,但您要先打印它。从递归调用中删除 return 并将 putchar 移到末尾。此外,while 循环应该是if

void int2str(int radix, int value) {

    int lastdigit = value % radix;
    int firstdigits = value / radix;

    if (firstdigits) {
        int2str(radix, firstdigits);
    }

    putchar(int2char(radix, lastdigit));

}

【讨论】:

    【解决方案3】:

    试试这个

    c = int2char(radix, result);
    
    if (division > 0) 
         int2str(radix, division);
    putchar(c);
    

    最后一次调用int2str 将打印第一个数字,而第一次调用将打印最后一个数字。

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多