【问题标题】:Having trouble creating a program that uses recursion [closed]创建使用递归的程序时遇到问题[关闭]
【发布时间】:2019-12-30 18:36:50
【问题描述】:

我正在尝试编写一个使用递归计算 1+2+3...+n 的程序。我刚开始学C,所以我很糟糕...... 这是我现在拥有的:

#include <stdio.h>
int adder;
adder=1;
int sum(int numba) {
    if (adder==numba) {
        return(sum);
    }
    return(sum+adder);
    ++adder;
}

int main() {
    char line[100];
    int nummba;
    printf("Enter in a number: ");
    fgets(line, sizeof(line), stdin);
    sscanf(line, "%d", nummba);
    printf("The sum of numbers from 1 to %d is %d.", nummba, sum(nummba));
    return(0);

}

显然不行... 如何使用递归解决 1+2+3...n? 谢谢。

【问题讨论】:

  • 考虑到您在函数之外有一个通用语句,您显示的代码甚至不会构建。也许你的问题之一(你有更多)?如果您询问有关构建错误的问题,请在问题中包含您想知道的实际错误,并完整复制粘贴为文本。也请花一些时间阅读how to ask good questions,以及this question checklist
  • 递归函数的定义特征是它调用自身。您的功能不这样做。考虑一下如果没有变量 adder 会怎样做,而不是使用对 sum() 的递归调用的返回值。
  • return(sum); - 除了函数本身之外,您没有任何名为 sum 的东西。请先编写一些代码来计算总和,这是编译并给出正确的结果。他们更改它以符合您的额外要求。更不用说C了。你能写出求和的递归公式吗?
  • 递归调用就像对任何函数的任何其他调用一样,语法完全相同。

标签: c function recursion sum definition


【解决方案1】:

对于初学者来说,不需要使用全局变量。

其次在这些陈述中

return(sum);

return(sum+adder);

sum 是指向函数的指针。所以return语句的表达式没有意义。

而且这个代码sn-p

int adder;
adder=1;

甚至不会编译,因为您可能不在文件范围内使用语句。至少你应该写

int adder = 1;

函数可以如下所示

unsigned long long int sum( unsigned int n )
{
    return n == 0 ? 0 : n + sum( n - 1 );
}

这是一个演示程序。

#include <stdio.h>

unsigned long long int sum( unsigned int n )
{
    return n == 0 ? 0 : n + sum( n - 1 );
}

int main(void) 
{
    printf( "Enter in a non-negative number: " );

    unsigned int n = 0;

    scanf( "%u", &n );

    printf( "The sum of numbers from 0 to %u is %llu.\n", n, sum( n ) );

    return 0;
}

它的输出可能看起来像

Enter in a non-negative number: 10
The sum of numbers from 0 to 10 is 55.

【讨论】:

    【解决方案2】:

    递归要求函数调用自身。你没有这样做,所以你一开始就没有递归函数。考虑以下代码:

    #include <stdio.h>
    
    int sum(int n) {
        if (n == 0)
            return n;
        else
            return n + sum(n - 1);
    }
    
    int main() {
        int n;
        char line[100];
    
        printf("Enter in a number: ");
        fgets(line, sizeof(line), stdin);
    
        sscanf(line, "%d", &n);
        printf("The sum of numbers from 1 to %d is %d.\n", n, sum(n));
    
        return(0);
    }
    

    如果您现在觉得递归有点困难,您可以选择使用while 循环的不太困难的解决方案:

    int sum(int n)
    {
        int i = 0;
        int j = 1;
    
        while (j <= n)
        {
            i += j++;
        }
        return i;
    }
    

    【讨论】:

    • 第三种解决方案是return n * (n+1) / 2;。如果我们在这里讨论选项...
    • 当然可以。我怎么错过了? :)
    • sizeof(line) - 1 --> sizeof line: fgets() reads at most one less than the maximum number of characters specified, leaving room for the \0 terminator. 更重要的是,sum() 需要在基本情况不满足时返回一些东西;也许你的意思是:n += sum(n - 1); --> return n + sum(n - 1)。另外,请注意输入中的负数......
    • 我不会担心引入unsigned 类型,但是您可以在输入提示中明确输入应该是非负数;)
    • 我会更改比较以检查负值:if (n &lt;= 0) return 0; else return n + sum(n - 1);(或单行:int sum (int n) { return n &gt; 0 ? n + sum(n - 1) : 0; })。但我首先不会为这个任务编写递归函数。原始问题不是使用递归的好例子。
    【解决方案3】:

    将您的代码更改为:

    #include <stdio.h>
    int sum_val=0;
    
    void sum(int numba) 
    {
        if(numba>=1)
        {
            sum_val=sum_val+numba;
            sum(numba-1);
        }
    }
    
    int main() 
    {
        int nummba;
        printf("Enter in a number: ");
        scanf(" %d",&nummba);
        sum(nummba);
        printf("The sum of numbers from 1 to %d is %d.", nummba, sum_val);
        return(0);
    }
    

    你的代码编译了吗?

    【讨论】:

    • 为什么这样更好?你做了哪些改变?你为什么要做出这些改变?没有解释的纯代码答案是非常不鼓励的,因为它们倾向于宣传cargo cult programming,这很糟糕。在答案中发布 cmets(比如你的问题)也是错误的。请阅读(或刷新)how to write good answers
    • @Someprogrammerdude 以后会注意的。
    • " %d" 中不需要前导空格,因为 %d 指令会自动丢弃前导空格。
    • 使用文件范围变量sum_val而不是从函数返回结果和有什么意义?
    猜你喜欢
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多