这个递归调用没有看懂耶
#include<stdio.h>void f(int x[],int n)
{
if(n>1)
{
f(&x,n-1);
printf("%d",x);
}
else
printf("%d",x);
}
void main()
{
int z={1,2,3,4,5,6};
f(z,6);
printf("\n");
}
输出的结果是654321。。关于那个f函数,我只看懂了,输出x,也就是把1输出来了。其余的65432不知道怎么来的,,有点迷茫。 能不能仔细地讲一讲??谢谢!!
已解决是看懂了的意思吗?需要帮助吗? 本帖最后由 jackz007 于 2019-2-15 20:56 编辑
把递归函数 f(const int x[] , const int n) 中的数组 x[] 改成指针也许比较容易说明问题:
#include <stdio.h>
void f(const int * x , const int n)
{
if(n > 1) {
f(x + 1 , n - 1) ;
printf(" %d" , * x) ;
} else {
printf("%d" , * x);
}
}
main(void)
{
int z = {1 , 2 , 3 , 4 , 5 , 6} ;
f(z , 6) ;
printf("\n") ;
}
函数 f() 每次递归调用传进去的参数都有变化,其中,x 会指向后一个元素,n 会减 1,直到 n = 1 终止递归。
第 1 次调用 x = 1 , n = 6- 继续递归
第 2 次调用 x = 2 , n = 5- 继续递归
第 3 次调用 x = 3 , n = 4- 继续递归
第 4 次调用 x = 4 , n = 3- 继续递归
第 5 次调用 x = 5 , n = 2- 继续递归
第 6 次调用 x = 6 , n = 1- 终止递归
n = 1 终止递归,首先输出数组 x[] 的第 6 个元素 6,然后递归函数继续按照 n = 2、3、4、5、6 的顺序依次逐级返回,于是,又先后陆续输出后面的 5、4、3、2、1
jackz007 发表于 2019-2-15 20:40
把递归函数 f(const int x[] , const int n) 中的数组 x[] 改成指针也许比较容易说明问题:
原程序中的f(&x,n-1)我可能没看懂... 我以为这就是传了x的地址,而你说这是使x指向后一个元素。。我有点不理解 本帖最后由 jackz007 于 2019-2-15 21:57 编辑
哈哈哈的 发表于 2019-2-15 21:30
原程序中的f(&x,n-1)我可能没看懂... 我以为这就是传了x的地址,而你说这是使x指向后一个元素。。 ...
你理解的没错,& x 确实是取 x 的地址,但并非主函数中数组元素 z 的地址。也就是说,每次递归时,用 & x 表达的数组首地址是不断变化的。
递归过程如果用原数组 z[] 来表达会更容易理解:
f(& z , 6) ;
f(& z , 5) ;
f(& z , 4) ;
f(& z , 3) ;
f(& z , 2) ;
f(& z , 1) ;
页:
[1]