请解释一下这个C程序的工作原理 #包括 无效函数1(整数n) { 如果(n==0)返回; printf(“%d”,n); func2(n-2); printf(“%d”,n); } 无效函数2(整数n) { 如果(n==0)返回; printf(“%d”,n); func1(++n); printf(“%d”,n); } void main() { 职能1(5); }
输出:53423123445请解释一下这个C程序的工作原理 #包括 无效函数1(整数n) { 如果(n==0)返回; printf(“%d”,n); func2(n-2); printf(“%d”,n); } 无效函数2(整数n) { 如果(n==0)返回; printf(“%d”,n); func1(++n); printf(“%d”,n); } void main() { 职能1(5); },c,function,output,function-calls,C,Function,Output,Function Calls,输出:53423123445 我不理解导致上述输出的代码中发生的控制流。有人能解释一下吗。提前感谢:)如果我们对每个printf进行注释,这样我们就可以知道程序中哪个部分的数字了。我还将把起始条件改为3,这样我们就可以完成整个过程 #include<stdio.h> void func1(int n) { if(n==0) return; printf("%d",n); func2(n-2); printf("%d",n); } void func2(in
我不理解导致上述输出的代码中发生的控制流。有人能解释一下吗。提前感谢:)如果我们对每个
printf
进行注释,这样我们就可以知道程序中哪个部分的数字了。我还将把起始条件改为3,这样我们就可以完成整个过程
#include<stdio.h>
void func1(int n)
{
if(n==0) return;
printf("%d",n);
func2(n-2);
printf("%d",n);
}
void func2(int n)
{
if(n==0) return;
printf("%d",n);
func1(++n);
printf("%d",n);
}
void main()
{
func1(5);
}
如果我们对每个
printf
进行注释,那么就更容易理解了,这样我们就可以知道哪个数字来自程序的哪个部分。我还将把起始条件改为3,这样我们就可以完成整个过程
#include<stdio.h>
void func1(int n)
{
if(n==0) return;
printf("%d",n);
func2(n-2);
printf("%d",n);
}
void func2(int n)
{
if(n==0) return;
printf("%d",n);
func1(++n);
printf("%d",n);
}
void main()
{
func1(5);
}
通过教学生递归如何处理局部变量,我发现最简单的理解方法是,如果你完全按照计算机所做的去做, -一步一步地处理它,写下调用的内容,以及变量值何时更改 例如:
func1 before: 3
func2 before: 1
func1 before: 2
func1 after: 2
func2 after: 2
func1 after: 3
您还需要了解,在每个函数调用中,
函数中对“n”的更改不会更改较早的
从调用它的位置获取的值
如果你想象计算机做这样的事情,你会看得更清楚:
每个函数调用都会在堆栈上创建一组新的变量,
当函数返回时,它的变量从堆栈中删除
main
func1(5)
n=5
printf 5
func2(5-2)
n=3
print 3
++n
n=4
func1(4)
n=4
print 4
func2(4-2)
n=2
print 2
++n
n=3
func1(3)
n=3
print 3
func2(3-2)
n=1
print 1
++n
n=2
func1(2)
n=2
print 2
func2(2-2)
n=0
if n==0 => return
print 2
print 2
print 3
print 3
print 4
print 4
print 5
//done
等等,直到它结束,最后一个“5”被打印出来。我通过教学生递归如何处理局部变量发现,理解它最简单的方法是,如果你完全按照计算机的操作, -一步一步地处理它,写下调用的内容,以及变量值何时更改 例如:
func1 before: 3
func2 before: 1
func1 before: 2
func1 after: 2
func2 after: 2
func1 after: 3
您还需要了解,在每个函数调用中,
函数中对“n”的更改不会更改较早的
从调用它的位置获取的值
如果你想象计算机做这样的事情,你会看得更清楚:
每个函数调用都会在堆栈上创建一组新的变量,
当函数返回时,它的变量从堆栈中删除
main
func1(5)
n=5
printf 5
func2(5-2)
n=3
print 3
++n
n=4
func1(4)
n=4
print 4
func2(4-2)
n=2
print 2
++n
n=3
func1(3)
n=3
print 3
func2(3-2)
n=1
print 1
++n
n=2
func1(2)
n=2
print 2
func2(2-2)
n=0
if n==0 => return
print 2
print 2
print 3
print 3
print 4
print 4
print 5
//done
等等,直到它完成,最后一个“5”被打印出来。你以前在编程中处理过递归吗?没有。是这样吗?请查看c中的递归。您可以检查不同站点的(例如:Tutorialspoint),该程序不会编译,因为可以使用@AnttiHaapala
void main()
。当然这不是正确的签名,但它会起作用。你以前在编程中处理过递归吗?没有。是这样吗?看看c中的递归。您可以检查不同站点的(例如:Tutorialspoint),该程序不会编译,因为可以使用@AnttiHaapalavoid main()
。当然这不是正确的签名,但它会起作用的。