鱼C论坛

 找回密码
 立即注册
查看: 1983|回复: 6

[已解决]遞迴函數初階問題

[复制链接]
发表于 2022-5-11 11:27:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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 12:35:36
[b]
因为形参变量属于局部变量,你将 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++;
}
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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--的值
而是依照之前每次放入的參數,用當時放入的參數的值進行運算並打印
我沒有注意到這個差別,才一直想不通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

抱歉...你的回答...好像不是我的問題
我問的不是前半段為什麼沒有打印-1
而是後半段為什麼不是從0開始打印
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-11 12:35:36 | 显示全部楼层    本楼为最佳答案   
[b]
因为形参变量属于局部变量,你将 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++;
}
[/b]

评分

参与人数 1荣誉 +5 鱼币 +3 贡献 +3 收起 理由
一隻太平洋睡鯊 + 5 + 3 + 3 原來是有沒有放入參數導致的問題!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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




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

评分

参与人数 1荣誉 +1 贡献 +1 收起 理由
一隻太平洋睡鯊 + 1 + 1 沒事XD

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



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

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
一隻太平洋睡鯊 + 1 + 1 + 1 感謝回答~~^^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 16:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表