【问题标题】:Recursive functions in C and printfC 和 printf 中的递归函数
【发布时间】:2017-11-28 18:45:52
【问题描述】:

所以,首先我是 C 的初学者,我们正在大学学习它的“结构化编程”课程。

现在,作为初学者的我,最近几节关于“递归函数”的讲座让我感到很痛苦。谁能给我解释一下:

所以我有这个小脚本,一个递归函数,它接受一个十进制数并将其转换为二进制数:

#include <stdio.h>

void binary(int num)
{
    if (num == 0) return;

    binary(num / 2);
    printf("%d", num % 2);
}

int main()
{
    int n;
    scanf("%d", &n);
    binary(n);
    return 0;
}

现在我想知道,这个功能是如何工作的?我知道它背后的逻辑以及它应该做什么,但我不知道它是如何做到的。底部的 printf 尤其让我失望,例如,如果 printf 函数在递归调用之前,对于输入的十进制 10,它会打印出(0101),但如果它在它下面,它会打印出正确的二进制数(1010)?

非常感谢任何形式的帮助,亲切的问候。

【问题讨论】:

  • 用铅笔和一张纸“用手”天真地“执行”你的程序,你就会明白了。
  • 请注意,当n 为零时,该函数不会打印任何内容。

标签: c recursion printf


【解决方案1】:

反转是使用函数的调用堆栈完成的。我的意思是调用函数的方式,这保证MSB将首先打印,然后是下一个,依此类推。

void binary(int num)
{
    if (num == 0) return;

    binary(num / 2);  // Wait, I will print but you first print the MSB's.
    printf("%d", num % 2); // Now I print the last digit.
}

向下运动移动呼叫。

{binary(12)                     
   {binary(6)                 
      {binary(3)        
        {binary(1)  
             binary(0) -- returns
        Now we print 1
        }
      print 1
      }
   prints 0
   }
prints 0
}

【讨论】:

  • 我不知道这一点,但感谢您和@Michael Waltz,现在它更加清晰了。我会花一些时间在这本书上阅读更多关于调用堆栈的信息,谢谢。
【解决方案2】:

如果想要递归打印带有前导零的字符的位, 他可以使用以下代码:

#include <stdio.h>

void print_bit_iter(char x, int n)
{
    int bit = (x & (1 << n - 1)) != 0;
    printf("%d", bit);

    if(n != 0)
      print_bit_iter(x, n - 1);
}

int main()
{
  print_bit_iter('U', 8);
}

这会有

01010101

作为输出。

【讨论】:

  • 那是什么#include &lt;iostream&gt; ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2013-04-21
  • 1970-01-01
相关资源
最近更新 更多