【问题标题】:Assigning a function call to a variable in a recursion results in different output在递归中将函数调用分配给变量会导致不同的输出
【发布时间】:2016-07-20 14:14:10
【问题描述】:

以下是两个类似的示例,它们定义了一个递归函数,该函数将打印小于 5 的数字的位数,同时对它们进行计数。

输入:12345
输出:1234 : 4 //有4位小于5


#include <stdio.h>

int function(int n) {
    if(!n) return 0;

    int r = function(n/10); 

    if ((n%10) < 5) {
        printf("%d", n%10);
        return r+1;
    }
    else return r;
}

int main() {
    int  x;

    scanf("%d", &x);
    printf(" : %d\n", function(x));

    return 0;
}


具有相同功能的第二个代码,但会反向打印我似乎无法理解的所有内容。希望问题说清楚。

输入:12345
输出:4321:4


#include <stdio.h>

int function(int n) {
    if(!n) return 0;

    if(n%10<5) {
        printf("%d", n%10);
        return function(n/10)+1;
    }
    return function(n/10);
}

int main() {
    int x;

    scanf("%d", &x);
    printf(" : %d\n", function(x));

    return 0;
}

【问题讨论】:

  • 比较两个代码。他们有什么不同?由于您的问题与输出数据的顺序有关,因此要特别注意操作的顺序。提示:将函数结果分配给变量本身与它没有任何关系。在不改变其可观察行为的情况下,重写第二个代码来做到这一点并不难。
  • 试着用铅笔和一张纸来解决这个问题。当你调用 function(12345) 时会发生什么?对于情况 2,它未通过 n%10

标签: c recursion


【解决方案1】:

在第一个示例中,您在打印之前调用函数,因此调用和打印按以下顺序发生:

call function(12345)
> call function(1234)
>> call function(123)
>>> call function(12)
>>>> call function(1)
>>>>> call function(0)
>>>>>> immediate return
>>>>> print 1
>>>> print 2
>>> print 3
>> print 4
> no print

在第二个例子中,你先打印然后调用函数,所以顺序是:

call function(12345)
> no print
> call function(1234)
>> print 4
>> call function(123)
>>> print 3
>>> call function(12)
>>>> print 2
>>>> call function(1)
>>>>> print 1
>>>>> call function(0)
>>>>>> immediate return

【讨论】:

    【解决方案2】:

    即使我喜欢处理递归,有时我仍然遇到困难。在 int r = function(n/10); 中,您的函数会一直运行到与 0 发生冲突。敲击时,由于堆栈结构,数字按 1-2-3-4-5 的顺序排列。 (看后进先出)。在此订单过程中将打印 1-2-3-4-5。对于第二个代码,在检查 if(n%10&lt;5) 之后,您已经首先运行 printf("%d", n%10); 所以它以 5-4-3-2-1 开始,然后运行 ​​function(n/10)+1; 所以它再次划分 1234 / 10,123/10,....正在进行中,直到与0 发生冲突。恕我直言,如果堆栈结构良好,可以更好地理解递归。

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2012-04-26
      • 2021-12-11
      相关资源
      最近更新 更多