【问题标题】:Stop a function from to break infinite recursion停止函数以中断无限递归
【发布时间】:2019-02-03 03:24:47
【问题描述】:

由于我正在做的这个练习,我被困在这部分。我需要取两个数字并输出数字,直到它达到零,然后直到相同的值但为负。例如:

输入: 10, 2

输出: 10, 8, 6, 4, 2, 0, -2, -4, -6, -8, -10

我可以让它下降到零,但我用零来停止递归我不知道如何使用零让它上升到初始数字。

代码:

#include <stdio.h>

int recursion(int n, int m) {
if(n == 0) {
    return n;
} else if(n > 0) {
    printf("%d ", n);
    return recursion(n - m, m);
} else if(n <= 0) {
    printf("%d ", n);
    return recursion(n + m, m);
}


 }

int main() {

    int n, m;

    scanf("%d %d", &n, &m);

    printf("%d ", recursion(n, m));


    return 0;
}

【问题讨论】:

  • 为什么要用0作为终结符?您知道 真正的 终止符,并且每次都不需要做任何事情,只需要一个算术运算。
  • @DaveNewton 我应该使用什么?编辑:我认为我应该使用 n 但 n 会减少函数的每次迭代,所以我如何存储 n 的初始值?
  • 或者,您也可以在递归调用链的背面打印负数。即打印x;递归;打印-x。
  • 你必须使用递归吗?这是一个简单的 for 循环:for (i = n; i &gt;= -n; i -= m),其中n 是原始输入。
  • 您是否有机会发布实际的练习文本/说明,以便我们了解您的具体要求?

标签: c


【解决方案1】:

我怀疑练习的目的是让函数在进行递归时打印数字并在退出时打印它们的否定:

#include <stdio.h>

static void recursion(int n, int m)
{
    printf("%d ", n);
    if (n <= 0)
        return;
    recursion(n-m, m);
    printf("%d ", -n);
}

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    recursion(n, m);
    printf("\n");
    return 0;
}

【讨论】:

  • 谢谢,我刚刚测试过了。你能告诉我为什么它不适用于 n = 7 和 m = 3 的 7 和 3 吗?
  • @Stefan:代码在n == 0 时停止。对于 7 和 3,步长为 7、4、1、-2。您可能希望将停止条件更改为n &lt;= 0。但是,您没有向我们展示实际的问题陈述,所以我们不知道。
  • 感谢您的帮助。
  • 函数中的最后一个 printf 如何反向打印数字但不重复,因为据我了解,它应该一个接一个地打印,而您的函数仅在
  • @LasseVågsætherKarlsen:我们不知道当第一个数字不是第二个数字的倍数时输出应该是什么,因为尚未提供完整的问题陈述。这个问题没有说明输出应该是一个扩展到负数的算术序列。
【解决方案2】:

我会尽力回答这个问题。但请记住,此解决方案仅在减数(即 m)以这样的方式减去(m)时有效还会继续递归下去。

`int recursion(int n, int m) {
   if(n == 0) {
     printf("0 ");
   } else {
       printf("%d ", n);
       return recursion(n - m, m);
       printf("%d ", -n);
   } 
}`

【讨论】:

    【解决方案3】:

    我认为递归的基本情况不好。我调整了基本情况,以便它可以正确停止。这是我的解决方案:

    #include <stdio.h>
    #include <math.h>
    
    int recursion(int n, int m, int upperLimit) {
        if (n < upperLimit && abs(n-m) >= upperLimit) {
            return n;
        }
        printf("%d ", n);
        return recursion(n - m, m, upperLimit);
    }
    
    int main() {
    
        int n, m;
    
        scanf("%d %d", &n, &m);
    
        printf("%d ", recursion(n, m, n));
    
    
        return 0;
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-29
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多