不理解这个反转数字数字的递归函数

时间:2015-06-03 20:13:07

标签: c

我找到了这段代码

#include <stdio.h>
#include <math.h>

int rev(int num)
{
    if(num < 10)
        return num;
    else
        return (num % 10) * pow(10, (int)log10(num)) + rev(num/10);
}

int main(void)
{
    printf("%d\n", rev(12345));

    return 0;
}

我开始分析它,但现在我有一个怀疑是以下,根据我的理解,回到起点,用(num%10)获得什么值是(1,2,3,4,5),但在尝试手动计算时,我没有得到预期值。

如果有人向我解释这个,或者我错过了什么,这里会发生什么?

1 个答案:

答案 0 :(得分:4)

int rev(int num) // num = 12345
{
    if(num < 10) // false
        return num;
    else
        return (num % 10) * pow(10, (int)log10(num)) + rev(num/10);
        //     (12345 % 10) * 10 ^ (log 12345) + rev(12345/10);
        //     5 * 10 ^ (4) + rev (1234)
        //     50000 + rev(1234)
}

基于此,我们可以假设:

rev(12345) = 50000 + rev(1234)
rev(1234) = 4000 + rev(123)
rev(123) = 300 + rev(12)
rev(12) = 20 + rev(1)
rev(1) = 1

所以,最终的结果是:

rev(12345) = 50000 + 4000 + 300 + 20 + 1 = 54321

这是一个简单的数学,唯一不重要的规则是(int)log10(num),但@QuestionC在他的评论中对此进行了解释。