使用递归进行基本转换

时间:2013-09-16 20:39:43

标签: c recursion

我正在完成一项任务并将其部分解决。 目前我正在获得正确的输出,只是相反。

这是我实施的辅助功能:

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'。

3 个答案:

答案 0 :(得分:2)

首先,您对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';
    }   

答案 1 :(得分:1)

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));

}

答案 2 :(得分:0)

试试这个

c = int2char(radix, result);

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

上次拨打int2str会打印第一个数字,而第一个电话将打印最后一个数字。