一隻太平洋睡鯊 发表于 2022-5-11 11:27:40

遞迴函數初階問題

#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:27:41

本帖最后由 一隻太平洋睡鯊 于 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--的值
而是依照之前每次放入的參數,用當時放入的參數的值進行運算並打印
我沒有注意到這個差別,才一直想不通

一隻太平洋睡鯊 发表于 2022-5-11 12:35:00

Twilight6 发表于 2022-5-11 12:10
因为 print 在 if 代码块之后呀,所以导致 if 条件成立后直接 return 了,没机会打印 -1 ,你那种情况应 ...

抱歉...你的回答...好像不是我的問題{:10_284:}
我問的不是前半段為什麼沒有打印-1
而是後半段為什麼不是從0開始打印

Twilight6 发表于 2022-5-11 12:35:36


因为形参变量属于局部变量,你将 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++;
}

Twilight6 发表于 2022-5-11 12:36:05

一隻太平洋睡鯊 发表于 2022-5-11 12:35
抱歉...你的回答...好像不是我的問題
我問的不是前半段為什麼沒有打印-1
而是後半段為什麼不 ...



我刚刚发现了,抱歉,我重新编辑了 哈哈

Twilight6 发表于 2022-5-11 12:40:29

一隻太平洋睡鯊 发表于 2022-5-11 12:35
抱歉...你的回答...好像不是我的問題
我問的不是前半段為什麼沒有打印-1
而是後半段為什麼不 ...



后半段的 打印 你是将 x++ 放在了 printf 前面了,所以从 1 开始了

Twilight6 发表于 2022-5-11 13:30:33

一隻太平洋睡鯊 发表于 2022-5-11 13:27
原來是這個問題,我又去看了教科書前面的範例,
發現問題在於void dofun(int x)的參數(int x)
有參數 ...



对的,你不传入参数,那么就是改变全局变量 x

页: [1]
查看完整版本: 遞迴函數初階問題