【问题标题】:Print number of recursions in C打印 C 中的递归数
【发布时间】:2022-01-02 20:11:08
【问题描述】:

所以我有一个这样的练习: 编写用户输入 2 个自然数 X 和 Y 的程序。输出必须打印递归计算的组合数,以使用 X 1 和 Y 0 生成二进制数。 例如,用户输入 2 和 3。2 和 3 的组合生成二进制数是:

  1. 00011
  2. 00101
  3. 00110
  4. 01001
  5. 01010
  6. 01100
  7. 10001
  8. 10010
  9. 10100

10。 11000

程序必须打印“10”。

所以我已经编写了递归代码,但我想不出一种打印数字“10”的方法。 这是我的代码

#include <stdio.h>
#include <stdlib.h>

int recursion(int a, int z)
{

    if(a==0 && z==0)
    {
        printf(".");
        return 1;
    }

    if(a!=0 && z==0)
        return recursion(a-1,z);
    if(a==0 && z!=0)
        return recursion(a,z-1);
    if(a!=0 && z!=0)
        return recursion(a-1,z)+recursion(a,z-1);

}

int main()
{

    int a,z;

    scanf("%d %d", &a, &z);

    recursion(a,z);

    return 0;
}

此代码仅打印 10 个“。”而不是我需要的点数。有什么想法吗?

【问题讨论】:

  • 你的意思是你不知道如何打印recursion()返回的值?
  • 与你的问题无关,写这样的递归混乱是非常糟糕的做法,这个练习的重点是学习有害的做法而不是好的做法。
  • 是递归赋值吗?因为这个任务可以使用combination来解决。答案是 C(x + y, x)
  • 切勿在未检查返回值的情况下对用户输入使用 scanf()。您的 a 和 z 可能未初始化。 (如果我每次写这篇文章都有一分钱……他们不再教孩子这些东西了吗?)

标签: c recursion binary


【解决方案1】:
#include <stdio.h>
#include <stdlib.h>

int recursion(int a, int z)
{ int d;

    if(a==0 && z==0)
    {
        d++;
       
        return 1;
    }

    if(a!=0 && z==0)
        return recursion(a-1,z);
    if(a==0 && z!=0)
        return recursion(a,z-1);
    if(a!=0 && z!=0)
        return recursion(a-1,z)+recursion(a,z-1);

}

int main()
{

    int a,z,d;

    scanf("%d %d", &a, &z);

    d=recursion(a,z);
printf("%d",d);
    return 0;
}

【讨论】:

  • recursion() 中的d 未初始化,因此该值没有意义。它也不能在函数之外访问。
  • 请将返回码检查添加到scanf()。如果用户输入的不是两个整数,那么您正在处理未初始化的变量 (=> UB)。
【解决方案2】:

您的程序已经返回了它的递归级别,打印它的简单方法可能是:

int main()
{
    int a, z, level, read;

    do {
        read = scanf("%d %d", &a, &z);
        if (read != 2) {
            printf("Incorrect input, please try again"); 
        }
    } while (read != 2);

    level = recursion(a,z);
    printf("\n%d\n", level); /* Newline characters added to improve readability */
    
    return 0;
}

所以输出将是您在第 9 行打印的点和递归级别(在您的示例中为 10)。

..........
10

【讨论】:

  • 请将返回码检查添加到scanf()。如果用户输入的不是两个整数,那么您正在处理未初始化的变量 (=> UB)。
猜你喜欢
  • 2023-02-18
  • 2014-06-21
  • 2016-05-07
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多