遞迴函數初階問題
#include <stdio.h>#include <stdlib.h>
int x = 10;
void dofun();
int main(void){
dofun(x);
system("pause");
return 0;
}
void dofun(int x){
x--;
if (x < 0) return;
printf("%d\n", x);
dofun(x);
x++;
printf("%d\n", x);
}
為什麼打印出來是
9
8
7
6
5
4
3
2
1
0
1
2
3
4
5
6
7
8
9
10
而不是
9
8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9
呢?
在遞迴函數中,出現return的時候,x的值不是-1嗎?
從-1,x++開始,不是應該從0開始後半段的打印?? 本帖最后由 一隻太平洋睡鯊 于 2022-5-11 13:45 编辑
Twilight6 发表于 2022-5-11 12:35
因为形参变量属于局部变量,你将 x 传入 dofun 函数时是为内部的局部变量 x 赋值
所以递归过程中对内 ...
原來是這個問題,我又去看了教科書前面的範例,
發現問題在於void dofun(int x)的參數(int x)
有參數才有傳值的問題,改成
#include <stdio.h>
#include <stdlib.h>
int x = 10;
void dofun();
int main(void){
dofun();
system("pause");
return 0;
}
void dofun(){
x--;
if (x < 0) return;
printf("%d\n", x);
dofun();
x++;
printf("%d\n", x);
}
的話,就會打印出我以為的結果
因為教科書最前面的範例是像這樣沒有參數放入函數的狀況
如果有參數,就不會承接return前x--的值
而是依照之前每次放入的參數,用當時放入的參數的值進行運算並打印
我沒有注意到這個差別,才一直想不通
Twilight6 发表于 2022-5-11 12:10
因为 print 在 if 代码块之后呀,所以导致 if 条件成立后直接 return 了,没机会打印 -1 ,你那种情况应 ...
抱歉...你的回答...好像不是我的問題{:10_284:}
我問的不是前半段為什麼沒有打印-1
而是後半段為什麼不是從0開始打印
因为形参变量属于局部变量,你将 x 传入 dofun 函数时是为内部的局部变量 x 赋值
所以递归过程中对内部的 x 进行自增,自减都是对函数内局部变量 x 进行操作的
所以也就导致你 if 返回前 x = -1,而返回之后是回到了上一层的递归层,x 也还是为进入递归前 x 值
因为进入最后一层递归前,x 的值为 0,虽然在最后层递归中return 前 x = -1,但不影响递归进入前的 x 数值,即还是为 0
想像你那样输出参考以下代码:
#include <stdio.h>
#include <stdlib.h>
int x = 10;
void dofun();
int main(void) {
dofun(x);
system("pause");
return 0;
}
void dofun(int x) {
x--;
if (x < 0) return;
printf("%d\n", x);
dofun(x);
printf("%d\n", x);
x++;
}
一隻太平洋睡鯊 发表于 2022-5-11 12:35
抱歉...你的回答...好像不是我的問題
我問的不是前半段為什麼沒有打印-1
而是後半段為什麼不 ...
我刚刚发现了,抱歉,我重新编辑了 哈哈
一隻太平洋睡鯊 发表于 2022-5-11 12:35
抱歉...你的回答...好像不是我的問題
我問的不是前半段為什麼沒有打印-1
而是後半段為什麼不 ...
后半段的 打印 你是将 x++ 放在了 printf 前面了,所以从 1 开始了
一隻太平洋睡鯊 发表于 2022-5-11 13:27
原來是這個問題,我又去看了教科書前面的範例,
發現問題在於void dofun(int x)的參數(int x)
有參數 ...
对的,你不传入参数,那么就是改变全局变量 x
页:
[1]