我需要打印一个以N开头的数字序列,不使用循环,其中Ai+1=Ai - 5,如果是Ai>0,则Ai+1=Ai+5重复它直到Ai=N。
示例:输入
1 10
产出: 10 5 0 5 10
我编写了两个递归函数,并从一个系列函数中调用它们。但是下半段没有工作,因为x中存在一些垃圾值。
#include <stdio.h>
void rec2(int n, int n1)
{
printf("%d ", n);
if(n == n1) return;
else
{
rec2(n + 5, n1);
}
}
int rec(int n, int n1)
{
printf("%d ", n);
if(n > 0)
{
rec(n - 5, n1);
}
else
{
printf("returning :%d \n", n);
return n;
}
}
void series(int n, int n1)
{
int x;
x = rec(n, n1);
printf("llllll\n%d ", x);
return;
// rec2(x, n1);
}
int main() {
//code
int t;
scanf("%d ", &t);
while(t--){
int n, n1;
scanf("%d", &n);
// printf("%d ", n);
n1 = n;
/*if(n > 0)
{
n = n - 5;
}
else
{
n = n + 5;
}
printf("%d ", n); */
series(n, n1);
}
return 0;
}发布于 2019-09-10 06:00:52
问题在于递归函数rec。
int rec(int n, int n1)
{
printf("%d ", n);
if(n > 0)
{
rec(n - 5, n1);
}
else
{
printf("returning :%d \n", n);
return n;
}
}如果我们仔细观察一下它是如何工作的,我们就会发现问题所在:
第一,使用rec(10,10)调用它,这意味着它执行了代码的这一部分:
int rec(int n, int n1)
{
printf("%d ", n);
if(n > 0)
{
rec(n - 5, n1);然后使用rec (5,10)再次调用该函数,并再次执行该函数,直到这里:
int rec(int n, int n1)
{
printf("%d ", n);
if(n > 0)
{
rec(n - 5, n1);然后用rec (0.10)再次调用该函数,并再次执行该函数,这一次它运行到of,并打印并返回n的值。
printf("returning :%d \n", n);
return n;
}因为它是一个递归函数,所以它的工作还没有完成,因为有一些值存储在堆栈中,并且返回到它们。堆栈看起来是这样的:
0.0
5.5
10.10
由于工作是用值0完成的,所以它返回到值为5的位置。代码在这一行返回:
int rec(int n, int n1)
{
printf("%d ", n);
if(n > 0)
{
rec(n - 5, n1); <---- here
}他的死刑还在继续。因为它不需要执行,也不需要返回,所以它返回一些垃圾值,并再次使用堆栈中的值10,并再次执行相同的进程。这就是为什么你得到了一些垃圾值x,因为x得到了函数返回的最后一个值,这就是在从堆栈中获取最后一个值之后返回的值。
这不是您想要做的事情的解决方案,而是在x中获取垃圾值的原因。
希望能帮上忙!
发布于 2019-09-10 06:03:35
如果n>0的话,这是可行的
#include <stdio.h>
int rec(int n, int l, int nw)
{
if(n >= 0) {
printf("%d ", n);
}
if(!nw && n==l) {
return 0;
}
if( nw && n > 0) {
return rec(n - 5, l, nw);
}
nw = 0;
return rec(n + 5, l, nw);
}
int main() {
int n,t;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
rec(n,n, 1);
}
return 0;
}发布于 2019-09-10 05:40:05
花一些时间看看我关于如何完成代码be函数的示例
#include <stdio.h>
#include <stdlib.h>
int Function1(int Start,int Step){
int i;
/*Finish Start to 0 or close 0*/
for(i=Start;i>=0;i-=Step){
printf("%d\n",i);
}
return i+2*Step;
}
void Function2(int Start,int Step,int LastI){
for(;LastI<=Start;LastI+=Step){//we reserve i from last for loop
printf("%d\n",LastI);
}
}
int main(){
int Start=20,Step=5;
int i;
/*Finish Start to 0 or close 0*/
for(i=Start;i>=0;i-=Step){
printf("%d\n",i);
}
/*Finish 0 or close 0 to Start*/
i+=Step*2;//because after last loop will minus one more Step and you dont want repeat last one print
//so need add 2*Step
for(;i<=Start;i+=Step){//we reserve i from last for loop
printf("%d\n",i);
}
//All work find in main then start make a function do this
/*
for(i=Start;i>=0;i-=Step){
printf("%d\n",i);
}
Check you need pass Start,Step i is dont need pass but need get i+=Step*2;
Then finish Function1
for(;i<=Start;i+=Step){//we reserve i from last for loop
printf("%d\n",i);
}
Check you need pass Start,Step and i;
Then finish Function2
*/
printf("\n----------------------------------\n");
int LastI=Function1(Start,Step);
Function2(Start, Step, LastI);
return 0;
}1.至少要确保它主要起作用。
2.把你需要的东西变成一个函数,注意你需要的参数。
以及您的代码scanf(" %d ",&t);-> scanf(“%d ",&t);
https://stackoverflow.com/questions/57864396
复制相似问题