【问题标题】:Recursive function to print numbers counting down in c在c中打印倒计时数字的递归函数
【发布时间】:2019-10-04 23:16:51
【问题描述】:

我很想写一个程序,从键盘读取整数 n,并使用递归函数打印 n、n-1、... n。下面的代码有效,但我不完全理解为什么或涉及递归函数的步骤。有人可以解释一下吗?

void countingdown(int n){
    if (n == 1){
        printf("%d\n", n);
        return;
    }
    else {
        printf("%d\n", n);
        countingdown(n - 1);
        return;
    }
}

int main(){
    int n;
    printf("Enter an integer: ");
    scanf("%d", &n);
    countingdown(n);
    printf("\n");
    return 0;
} 

【问题讨论】:

  • 也许这个关于尾递归的答案会有所帮助:stackoverflow.com/a/37010/1212725
  • 如果您在调试器中运行程序,它可能会帮助您理解。使用这样的工具,您可以逐步运行程序并检查每一步中所有变量的值。

标签: c function recursion


【解决方案1】:

可以重写递归函数countdown()

类似

int countingdown(int n){

    if (n == 0){//return exit from recursion
        return;
    }
    else {
        printf("%d\n", n);
        countingdown(n - 1);
    }
}

假设我们用countdown(5) 调用它。 直到我们到达0 打印 n,即 5、4、3、2、1 将继续。在最后一步中,变量 n 达到 0,正如我们在 if 部分函数返回并执行结束时所表达的那样。

[编辑]

更好的

void countingdown(unsigned int n){

    if (n){
        printf("%d\n", n);
        countingdown(n - 1);    
    }

}

【讨论】:

  • 因为这是一个int函数,我不应该返回一个int吗?
  • 对于这种情况没有。其作品。但准确地说,您可以使用return 0
  • @user20102000 或者只是简单地从int更改--> void这个函数不需要返回任何东西。
  • @user20102000 我提供了一个更新的版本。
【解决方案2】:

例如,如果用户输入值 3,则会发生以下情况:

  1. 函数main 将调用countingdown 参数3
  2. 函数 countingdown 然后将这个参数 3 与值 1 进行比较,并且由于比较结果为 false,它将打印数字 3 然后调用countingdown(即函数将调用自身),参数为2
  3. countingdown 的第二个实例现在将这个参数 2 与值 1 进行比较,并且,由于比较结果为 false,它将打印数字 2 和使用参数1 调用countingdown
  4. countingdown 的第三个实例现在将参数 1 与值 1 进行比较,并且由于现在比较结果为 true,它将打印数字 1 和不会再调用自己。

递归函数将参数1 视为特殊参数,因为这是它应该中止的值。当它遇到这个值时,它将停止递归调用自己。如果函数没有检查这个特殊值,它会一直倒计时,还会打印0-1-2等。

【讨论】:

    猜你喜欢
    • 2023-02-18
    • 2013-07-16
    • 2015-05-18
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多