c - 用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.
}
}
希望你们能解释我的错误并帮助我理解为什么会发生在我身上,以帮助我避免这个愚蠢的错误。谢谢 :)
解决方案
您的算法存在一些问题。
for
循环多次调用程序,numbers
多次启动递归。您只需要启动一次,对吗?您使用 调用递归
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);
}
推荐阅读
- android-studio - 在 Android Studio 中:模拟器应用未更新
- c# - 如何在“for”循环中正确地从 0.0 迭代到 1.0?
- html - “城市”这个词只破坏了我在 Safari 中的布局
- python - 如何以非递减顺序对python中的列表进行排序?
- algorithm - 查找独立向量(高性能)
- r - 通过单击按钮在 Shiny 表中添加一个新的空行
- c# - C# Newtonsoft JSON 库为不同计算机上的同一数据集输出不同的错误 JSON 键
- java - 如何将此文本更改为字符串以将其传递给字符串翻译
- web - 如何通过cmd下载网站源代码?
- python - 无需广播的 Numpy 数组创建