C语言 递归反向工作,那么这个程序是如何按顺序打印数据的?



递归对我来说总是很麻烦。我理解当我们使用递归时,我们基本上是创建一些堆栈,在创建所有堆栈之后,递归以相反的顺序工作,然后打印结果。

我正在努力理解下面的程序

#include<stdio.h>
//function declaration
int RecursvFcnTogetPrcntge();
float Var;
unsigned int count=1;
float Prcntge;
int main()
{
printf("nEnter a value to split in percentage: ");
scanf("%f",&Var);
Var=Var/100;
RecursvFcnTogetPrcntge();

return 0;
}
int RecursvFcnTogetPrcntge()
{
if(count==3)
{
return 1;
}
Prcntge=Var*count;
printf("n%3d Percent = %.02f",count, Prcntge);
count++;
RecursvFcnTogetPrcntge();
return 0;
}

我们有计数3,这意味着我们将创建4个内存堆栈。1表示main, 2表示else, 1表示if (count == 3)然后返回1

如果它进入最后一个堆栈(count为3),那么它会告诉我们返回1。现在它返回1,我们在第三个堆栈中,在第三个堆栈中有一个打印,它应该打印计数2和数字的百分比。在第三个堆栈之后,它将分别进入第二个和第一个堆栈

因此,输出应该看起来像
2 Percent = 0.14
1 Percent = 0.07

但是为什么输出

1 Percent = 0.07
2 Percent = 0.14

如果它的递归反向工作,那么它如何按顺序调用函数?

我可能不清楚这个想法,但这是我对递归的理解。我将感激任何帮助。我遇到麻烦了。

递归不以"反向"方式工作,它以递归调用函数的任何顺序工作。在这种情况下,在递归地调用

函数之前调用print
int RecursvFcnTogetPrcntge()
{
if(count==3)
{
return 1;
}
...
printf("n%3d Percent = %.02f",count, Prcntge); // THIS COMES FIRST
...
RecursvFcnTogetPrcntge(); // THIS COMES SECOND
...
}

所以它将打印当前的递归帧,然后移动到下一帧。如果你在递归调用后放了一条print语句,你会看到它反向执行。

递归并不特殊,它就像任何其他函数调用一样。当你调用它时,它会完全执行函数,然后返回。只是有时候递归调用可以一次又一次地调用自己。在调用之前的任何内容将在调用之前执行,而在调用之后的任何内容将在调用之后执行

同时,while、if、for和else语句不会创建堆栈帧。

给定:

typedef struct node
{
int value;
struct node* next; // a null value here marks the end of the list.
} Node;

考虑下面两个递归函数,它们都输出一个链表。

// prints list in forward order;
void print(Node* list)
{
if (list == NULL) return;
printf("%dn", list->value);
print(list->next);
}
void printReverse(Node* list)
{
if (list == NULL) return;
printReverse(list->next);
printf("%dn", list->value);
}

第一个函数打印实参的值,然后递归打印列表的其余部分。它按照向前的顺序打印节点值,从第一个节点到最后一个。

第二个函数递归地调用自己,在运行过程中创建堆栈帧,然后,当它到达列表末尾时,在堆栈展开时(以相反顺序)打印每个节点的值。

递归可以在任意方向上工作。

最新更新