hanyf 发表于 2024-1-5 17:45:15

数组与指针

#include <stdio.h>       
bin(int x)
{
    if (x/2>0)
    bin(x/2);
    printf("%d",x%2);
}
main()
{
bin(12);
}
请问程序是怎么运行的

FishC 发表于 2024-1-5 17:46:00

这段代码是使用递归来将整数转换为二进制数的程序。

首先,在主函数main()中调用了bin(12)函数。在bin函数中,传入的参数x是12。在bin函数内部,它会判断x是否大于0,如果大于0,则调用自身,传入的参数是x除以2的整数部分。这个过程会一直进行下去,直到x/2小于等于0。然后,递归开始回溯,执行最后一条打印语句printf("%d", x % 2),它会输出x除以2的余数(也就是二进制数的最低位),然后回溯到上一级递归,再次输出余数,一直回溯到最上层的递归调用。

所以,bin(12)的执行过程如下:
bin(6) -> bin(3) -> bin(1) -> bin(0)
然后,bin(0)返回,继续执行上一级递归中的printf语句,输出1。然后,bin(1)返回,继续执行上一级递归中的printf语句,输出1。然后,bin(3)返回,继续执行上一级递归中的printf语句,输出0。最后,bin(6)返回,执行最上层的printf语句,输出1。

所以,程序的输出结果是1100。

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

hanyf 发表于 2024-1-5 17:51:58

FishC 发表于 2024-1-5 17:46
这段代码是使用递归来将整数转换为二进制数的程序。

首先,在主函数main()中调用了bin(12)函数。在bin函 ...

为什么不是110

FishC 发表于 2024-1-5 17:52:14

hanyf 发表于 2024-01-05 17:51
为什么不是110

非常抱歉,我之前的回复有误。正确的输出结果应该是1100,而不是110。现在让我来解释一下。

在这段代码中,通过递归将一个整数转换为二进制数。函数bin()接受一个整数参数x,并且在递归的过程中不断将x除以2,直到x小于等于0。在每次递归调用中,我们获取x除以2的余数并输出,然后再递归调用自身,传入x除以2的整数部分。最后,在递归回溯时,输出的顺序就是二进制数的位从低到高的顺序。

让我们来看一下bin(12)的执行过程:

1. bin(12) -> bin(6)
2. bin(6) -> bin(3)
3. bin(3) -> bin(1)
4. bin(1) -> bin(0)
5. bin(0)返回,输出1
6. bin(1)返回,输出1
7. bin(3)返回,输出0
8. bin(6)返回,输出1

因此,正确的输出结果应为1100,表示十进制数12的二进制形式。再次对之前的错误表示深表歉意,希望这次可以清楚明了地解释。如果还有其他问题,请随时提问。

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

hanyf 发表于 2024-1-5 17:57:03

FishC 发表于 2024-1-5 17:52
非常抱歉,我之前的回复有误。正确的输出结果应该是1100,而不是110。现在让我来解释一下。

在这段 ...

请问第一次取余的x不是6吗,不是bin(12)先变为bin(6)再取余的吗,还是不太理解,球球了

FishC 发表于 2024-1-5 17:57:12

hanyf 发表于 2024-01-05 17:57
请问第一次取余的x不是6吗,不是bin(12)先变为bin(6 ...

非常抱歉,让你感到困惑。我来重新解释一下。

在这段代码中,bin()函数是使用递归来将一个整数转换为二进制数的。当我们调用bin(12)时,程序会首先进入bin函数,并且按照以下的执行顺序进行:

1. bin(12)
2. bin(6)
3. bin(3)
4. bin(1)
5. bin(0)

在每一次递归调用中,都会判断当前的x是否大于0,如果是,则再次调用bin()函数并传入x除以2的整数部分。然后,在递归回溯的过程中,程序会执行print语句输出x除以2的余数。这样,就实现了将一个整数从右向左转换为二进制数的效果。

所以,当执行bin(12)时,递归的调用顺序是bin(12) -> bin(6) -> bin(3) -> bin(1) -> bin(0)。然后,程序开始逐级返回,输出的顺序是从最低位开始的。

希望这次的解释更加清楚明了。如果还有其他问题,请随时提问。

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

liyifeng295641 发表于 2024-1-5 19:59:01

首先这个程序是整数转换为二进制的程序。
12 转化为 二进制为 1110 = 2 ^ 3 + 2 ^ 2 + 2 ^ 1 + 2 ^ 0;
#include <stdio.h>      
bin(int x)
{
    if (x/2>0)
    bin(x/2);
    printf("%d",x%2);
}
main()
{
bin(12);
}
这个程序是怎么运行的,它是利用递归的思想,
1. bin(12) -> bin(6)
2. bin(6) -> bin(3)
3. bin(3) -> bin(1)
4. bin(1) -> bin(0)
5. bin(0)返回,输出1
6. bin(1)返回,输出1
7. bin(3)返回,输出0
8. bin(6)返回,输出1
(x % 2)能整除就1,否则就0。

jackz007 发表于 2024-1-5 22:04:47

bin(12) 逐级递归,在 x = 1 时抵达递归终点,然后,进入返回过程,在逐级返回的过程中,先后打印出数字 1100
x(12)
-> x(6)
   -> x(3)
         -> x(1)
                print(1 % 2) = 1- 递归终点
            print(3 % 2) = 1
      print(6 % 2) = 0
    print(12 % 2) = 0

行客 发表于 2024-1-6 14:03:26

FishC 发表于 2024-1-5 17:57
非常抱歉,让你感到困惑。我来重新解释一下。

在这段代码中,bin()函数是使用递归来将一个整数转换 ...

对楼主的代码做下纠错吧。

FishC 发表于 2024-1-6 14:03:37

行客 发表于 2024-01-06 14:03
对楼主的代码做下纠错吧。

非常抱歉给您带来了困惑。下面是修正后的代码:

#include <stdio.h>

void bin(int x) {
    if (x > 0) {
      bin(x / 2);
      printf("%d", x % 2);
    }
}

int main() {
    bin(12);
    return 0;
}

在这段代码中,我们定义了bin函数,它使用递归实现将一个整数转换为二进制数。在bin函数中,我们首先判断x是否大于0,如果是,则递归调用bin函数,并传入x除以2的整数部分。然后,在回溯的过程中,我们使用printf语句输出x除以2的余数,即二进制数的最低位。

在主函数main中,我们调用bin函数并传入参数12。程序会按照递归的方式来转换12为二进制数。最终,程序会输出1100作为结果。

希望这次的解释和代码能够正确明了。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 数组与指针