首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么x有垃圾价值?

为什么x有垃圾价值?
EN

Stack Overflow用户
提问于 2019-09-10 05:17:11
回答 3查看 149关注 0票数 1

我需要打印一个以N开头的数字序列,不使用循环,其中Ai+1=Ai - 5,如果是Ai>0,则Ai+1=Ai+5重复它直到Ai=N。

示例:输入

1 10

产出: 10 5 0 5 10

我编写了两个递归函数,并从一个系列函数中调用它们。但是下半段没有工作,因为x中存在一些垃圾值。

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

发布于 2019-09-10 06:00:52

问题在于递归函数rec。

代码语言:javascript
复制
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)调用它,这意味着它执行了代码的这一部分:

代码语言:javascript
复制
int rec(int n, int n1)
{
    printf("%d ", n);

    if(n > 0)
    {
        rec(n - 5, n1);

然后使用rec (5,10)再次调用该函数,并再次执行该函数,直到这里:

代码语言:javascript
复制
int rec(int n, int n1)
{
    printf("%d ", n);

    if(n > 0)
    {
        rec(n - 5, n1);

然后用rec (0.10)再次调用该函数,并再次执行该函数,这一次它运行到of,并打印并返回n的值。

代码语言:javascript
复制
    printf("returning :%d \n", n);
    return n;
}

因为它是一个递归函数,所以它的工作还没有完成,因为有一些值存储在堆栈中,并且返回到它们。堆栈看起来是这样的:

0.0

5.5

10.10

由于工作是用值0完成的,所以它返回到值为5的位置。代码在这一行返回:

代码语言:javascript
复制
int rec(int n, int n1)
{
    printf("%d ", n);

    if(n > 0)
    {
        rec(n - 5, n1); <---- here
    }

他的死刑还在继续。因为它不需要执行,也不需要返回,所以它返回一些垃圾值,并再次使用堆栈中的值10,并再次执行相同的进程。这就是为什么你得到了一些垃圾值x,因为x得到了函数返回的最后一个值,这就是在从堆栈中获取最后一个值之后返回的值。

这不是您想要做的事情的解决方案,而是在x中获取垃圾值的原因。

希望能帮上忙!

票数 1
EN

Stack Overflow用户

发布于 2019-09-10 06:03:35

如果n>0的话,这是可行的

代码语言:javascript
复制
#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;
}
票数 -1
EN

Stack Overflow用户

发布于 2019-09-10 05:40:05

花一些时间看看我关于如何完成代码be函数的示例

代码语言:javascript
复制
#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);

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57864396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档