首页 > 解决方案 > 用C语言递归数到一定的数

问题描述

我一直在尝试做一个程序,直到用户输入的数字(f,例如:10)递归。

如果用户输入 10,程序将必须打印出:1,2,3,4,5,6,7,8,9,10。

我得到了一个[1] 49348 segmentation fault ./recs.exe,我想知道我为什么要得到它以防止将来发生它。

这是我的代码:

#include <stdio.h>

int numbers(int n);

int main(int argc, char const *argv[]) {

  int number;

  int i;

  printf("Put a number and the program will do everything for ya.\n");

  printf("Number: ");

  scanf("%d", &number);

  for(i=0;i<=number;i++){

    printf("%d, ", numbers(i));

  }

}

int numbers(int n){

  if(n==0||n==1){

    return n;

  } else {

    return(numbers(n+1)); // I think the problem is here.

  }

}

希望你们能解释我的错误并帮助我理解为什么会发生在我身上,以帮助我避免这个愚蠢的错误。谢谢 :)

标签: c

解决方案


您的算法存在一些问题。

  1. for循环多次调用程序,numbers多次启动递归。您只需要启动一次,对吗?

  2. 您使用 调用递归n+1,实际上每次下一次调用都使用一个增量值,该值可以无限增加。您的递归没有出口,并且会因内存不足或崩溃而死。

要解决第一个问题,只需实例化一次。

要正确打印它,您需要使用带有递归的打印语句。

对于第二个问题,您可以采取不同的方法。以下是最容易理解的,它max作为第二个参数传递。

 void numbers(int n, int max) {
     printf(%d ", n);
     if (n >= max)
        return;
     numbers (n + 1, max);
  }

  int main() {
    ...
    numbers(1, number);
  }

一种更有效的方法是使用单个参数并将其倒数为 0。但是在要打印时必须小心。在您的情况下,如果您需要增加值的顺序,则必须确保您从递归返回后进行打印。

这是实现第二种方法的程序:

#include <stdio.h>

void numbers(int n);
int main(int argc, char const *argv[]) {
  int number;
  int i;
  printf("Put a number and the program will do everything for ya.\n");
  printf("Number: ");
  scanf("%d", &number);

  // start recursion.
  numbers(number);
  printf("\n");
}

void numbers(int n){
    if (n == 0)
        return;
    numbers(n-1);

    // after return from recursion
    printf("%d ", n);
}

推荐阅读