hanyf 发表于 2023-12-30 20:02:36

函数

void A(int num,int base)
{
if(num>0)
{
A(num/base,base);
printf("%d",num%base);
}
}
请问函数调用A(103,2)的输出结果为什么是0,我不太了解为什么是递归函数

FishC 发表于 2023-12-30 20:04:46

这是一个递归函数,它用于将一个十进制数转换成指定进制的数。让我们来分解一下函数的执行过程:

1. 首先,函数会判断num是否大于0,如果不大于0,则不进行任何操作。
2. 如果num大于0,函数会再次调用自身(递归),传入的参数为num除以base和base本身。
3. 这意味着,函数会先处理较高位的数字,并将结果打印出来。
4. 然后,函数会通过num%base取余数,打印出较低位的数字。

现在来看具体的例子:A(103, 2)。

1. 首先,函数判断103是否大于0,是的,所以继续执行。
2. 接下来,函数调用A(103/2, 2),即A(51, 2)。
3. 然后,函数又会调用A(51/2, 2),即A(25, 2)。
4. 继续调用A(25/2, 2),即A(12, 2)。
5. 再调用A(12/2, 2),即A(6, 2)。
6. 继续调用A(6/2, 2),即A(3, 2)。
7. 最后调用A(3/2, 2),即A(1, 2)。
8. 现在,函数判断1是否大于0,是的,所以继续执行。
9. 接下来调用A(1/2, 2),即A(0, 2)。
10. 此时,0不大于0,所以不做任何操作。

现在回到第7步,函数会输出1%2的结果,即1。然后回到第6步,输出3%2的结果,即1。再回到第5步,输出6%2的结果,即0。接着回到第4步,输出12%2的结果,即0。然后回到第3步,输出25%2的结果,即1。再回到第2步,输出51%2的结果,即1。最后回到第1步,输出103%2的结果,即1。

所以最终的输出结果应该是:1100111。

希望这可以解释清楚递归函数的执行过程!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

sfqxx 发表于 2023-12-30 20:07:08

你确定结果是0吗?

这个函数是将一个十进制数转换为指定的进制数。它是通过递归的方式,先对输入的数进行除法,然后在退栈的时候按照取余的结果打印出来。

在本例中,A(103,2)是将十进制数103转换为二进制数。具体过程如下:

首先,103除以2,得到51余1,然后递归调用A(51,2)。在这个调用中,51除以2得到25余1,然后再递归调用A(25,2)...... 这样一直进行下去,最后在A(1,2)中,由于1小于2,结束递归。

然后再在退栈的过程中,打印取余的结果。具体如下:

A(1,2)返回后,打印1除以2的余数1,然后是A(2,2)返回后,打印2除以2的余数0,然后是A(5,2)返回后,打印5除以2的余数1,然后是A(12,2)返回后,打印12除以2的余数0,然后是A(25,2)返回后,打印25除以2的余数1,然后是A(51,2)返回后,打印51除以2的余数1,最后是A(103,2)返回后,打印103除以2的余数1。

这样,整个过程结束,打印出的结果是01100111,这就是103的二进制表示。所以函数A(103,2)的输出结果为1110011,这是因为它是后序遍历方式打印出的,也就是先左后右。

hanyf 发表于 2023-12-30 20:11:46

sfqxx 发表于 2023-12-30 20:07
你确定结果是0吗?

这个函数是将一个十进制数转换为指定的进制数。它是通过递归的方式,先对输入的数进 ...

感谢

sfqxx 发表于 2023-12-30 20:13:41

hanyf 发表于 2023-12-30 20:11
感谢

不客气{:5_109:}
页: [1]
查看完整版本: 函数