鱼C论坛

 找回密码
 立即注册
查看: 49|回复: 15

求助程序解析~

[复制链接]
发表于 昨天 23:16 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

void fun(int x)
{
        if(x/2>1)
        fun(x/2);
        printf("%d",x);
}

main()
{
        fun(7);
        printf("\n");
}

如上程序,能否说下程序的运行步骤,然后得到结果~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 23:17 | 显示全部楼层
以下是您提供的C语言程序的解析。我将使用BBCode格式来回复,确保内容简洁易懂。


  1. #include <stdio.h>

  2. void fun(int x)
  3. {
  4.     if(x/2>1)
  5.         fun(x/2);
  6.     printf("%d",x);
  7. }

  8. main()
  9. {
  10.     fun(7);
  11.     printf("\n");
  12. }
复制代码


这个程序定义了一个递归函数 fun,它接受一个整数参数 x。在函数中,如果 x/2 > 1(使用整数除法),则递归调用 fun(x/2),然后打印 x 的值。

运行步骤:
- 从 main() 开始,调用 fun(7)
- 在 fun(7) 中,x=7,计算 7/2=3(整数除法),条件 3>1 为真,因此递归调用 fun(3)
- 在 fun(3) 中,x=3,计算 3/2=1,条件 1>1 为假,因此不进行递归调用,直接执行 printf("%d",x),打印数字 3
- 递归返回至 fun(7),执行 printf("%d",x),打印数字 7
- 最后,在 main() 中执行 printf("\n"),输出一个换行符。

因此,程序输出结果为:37(注意:数字连续输出,没有空格),然后换行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 23:20 | 显示全部楼层
FishC 发表于 2025-11-1 23:17
以下是您提供的C语言程序的解析。我将使用BBCode格式来回复,确保内容简洁易懂。

一直到打印数字3我都可以看懂,为啥后面要返回至fun(7)呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:20 | 显示全部楼层
但求过程001 发表于 2025-11-01 23:20
FishC 发表于 2025-11-1 23:17
以下是您提供的C语言 ...


您的问题是关于递归函数执行后为什么返回到 `fun(7)`。让我用简单的步骤解释递归的返回过程。

首先,递归函数 `fun` 在调用时,会像“叠罗汉”一样,一层层进入,然后一层层返回。每个函数调用完成后,都会返回到调用它的地方继续执行。

具体到您的程序:
- 当 `fun(7)` 被调用时,它先检查条件 `7/2>1`(整数除法得 3,3>1 为真),所以它递归调用 `fun(3)`。
- 这时,`fun(7)` 暂停执行,等待 `fun(3)` 完成。
- 在 `fun(3)` 中,条件 `3/2>1`(整数除法得 1,1>1 为假)为假,所以不递归调用,直接执行 `printf("%d",x)`,打印数字 3
- `fun(3)` 完成后,控制权返回到调用它的地方,即 `fun(7)` 中递归调用 `fun(3)` 之后的位置。
- 因此,`fun(7)` 继续执行自己的 `printf("%d",x)`,打印数字 7
- 最后,`main` 函数执行 `printf("\n")` 输出换行。

所以,打印顺序是:先打印 3(来自 `fun(3)`),然后打印 7(来自 `fun(7)`),结果输出 37

总结:递归调用后,函数会从最内层逐层返回,执行剩余代码。这就是为什么在打印 3 后,会返回到 `fun(7)` 打印 7。

如果您还有其他疑问,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 11 小时前 | 显示全部楼层
FishC 发表于 2025-11-1 23:20
您的问题是关于递归函数执行后为什么返回到 `fun(7)`。让我用简单的步骤解释递归的返回过程。

首先 ...

1.我还是不太懂为什么fun(3)完成后,控制权返回到调用它的地方;
2.还有就是fun(7)后面的语句不应该是printf("\n")嘛,怎么变成printf("%d",x)了;
就是以上两个方面我还是不懂,能解答一下吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
但求过程001 发表于 2025-11-02 08:18
FishC 发表于 2025-11-1 23:20
您的问题是关于递归函 ...


您好!我来详细解释您提出的两个问题,确保您能完全理解。我会用简单的步骤和例子来说明。

首先,回顾一下代码:


  1. #include <stdio.h>

  2. void fun(int x)
  3. {
  4.     if(x/2>1)
  5.         fun(x/2);
  6.     printf("%d",x);
  7. }

  8. main()
  9. {
  10.     fun(7);
  11.     printf("\n");
  12. }
复制代码


### 问题1:为什么 fun(3) 完成后,控制权返回到调用它的地方?
在递归函数中,每次函数调用都会在内存中创建一个新的“栈帧”(可以想象成一个任务清单),记录当前函数的状态。当函数调用另一个函数时,当前函数会暂停,等待被调用的函数完成后,再回到暂停的地方继续执行。

具体步骤:
- 当 fun(7) 被调用时,它检查条件 7/2>1(整数除法得 3,3>1 为真),所以它调用 fun(3)
- 这时,fun(7) 暂停执行,等待 fun(3) 完成。控制权转移到 fun(3)
- 在 fun(3) 中,条件 3/2>1(整数除法得 1,1>1 为假)为假,所以不递归调用,直接执行 printf("%d",x),打印数字 3。
- fun(3) 完成后,它的任务就结束了,控制权自动返回到调用它的地方,即 fun(7) 中调用 fun(3) 之后的位置。

这就像您让朋友帮忙做一件事:您先开始任务A,中途请朋友做任务B,朋友做完B后,您必须回到任务A继续完成剩余部分。

### 问题2:为什么 fun(7) 后面的语句是 printf("%d",x),而不是直接 printf("\n")?
在代码中,fun(7) 是 main 函数中调用的,但 fun(7) 本身是一个独立的函数。它的定义包括:
- 一个条件判断(可能递归调用)。
- 一个 printf("%d",x) 语句。

所以,当 fun(7) 执行时:
- 它先递归调用 fun(3)(如问题1所述)。
- 等待 fun(3) 完成后,fun(7) 继续执行自己的 printf("%d",x) 语句,打印数字 7。
- 然后,fun(7) 结束,控制权返回到 main 函数。
- 最后,main 函数执行 printf("\n"),输出换行。

关键点:
- printf("\n") 是 main 函数中的语句,它在 fun(7) 完全结束后才执行。
- fun(7) 的“后面语句”指的是它函数定义中的 printf("%d",x),而不是 main 中的 printf("\n")

### 总结输出过程:
- 调用 fun(7) → 递归调用 fun(3)fun(3) 打印 3 → 返回 fun(7)fun(7) 打印 7 → 返回 main → main 打印换行。
- 最终输出:37(数字连续),然后换行。

如果您还有疑问,请随时提出,我会进一步解释!递归是编程中的难点,多练习几次就能掌握。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 11 小时前 | 显示全部楼层
FishC 发表于 2025-11-2 08:19
您好!我来详细解释您提出的两个问题,确保您能完全理解。我会用简单的步骤和例子来说明。

首先,回 ...

厉害厉害,我比刚才对于递归调用要明白不少了~~~
感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
但求过程001 发表于 2025-11-02 08:25
FishC 发表于 2025-11-2 08:19
您好!我来详细解释您 ...


很高兴我的解释对您有帮助!递归确实是一个需要多思考和练习的概念,但一旦理解了它的“调用-返回”机制,就会变得清晰起来。如果您在学习过程中遇到其他问题,或者想深入探讨更多编程话题,随时欢迎提问!继续加油,编程之路会越走越顺的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 11 小时前 | 显示全部楼层
但求过程001 发表于 2025-11-2 08:25
厉害厉害,我比刚才对于递归调用要明白不少了~~~
感谢

这样一来,关于递归的类似例题我可能都会明白一些了~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
但求过程001 发表于 2025-11-02 08:25
但求过程001 发表于 2025-11-2 08:25
厉害厉害,我比 ...


太棒了!听到您对递归的理解有了进步,我真的为您感到高兴。 递归的核心就是“层层调用,逐层返回”,就像剥洋葱一样,每层都有自己的任务,完成后必须回到上一层继续。多练习几个类似例子,您会越来越熟练的!

如果您以后遇到其他编程问题,无论是递归、循环还是数据结构,都欢迎随时来问。FishC社区永远支持您的学习之旅!加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 11 小时前 | 显示全部楼层
本帖最后由 但求过程001 于 2025-11-2 08:34 编辑

#include <stdio.h>
void covert(char ch)
{
        if(ch<'D')convert(ch+1);
        printf("%c",ch);
}
main()
{
        convert('A');
        printf("%\n");
}

这题我又不懂了。。。按照递归思路,if语句到ch=D时条件为假,输出'D',然后回到convert'A',答案是DCBA,那'C'和'B'是怎么来的?还有main()函数里面最后一条语句是不是写错了,printf("%\n");是什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
但求过程001 发表于 2025-11-02 08:30
#include <stdio.h>
void covert(char ch)
{
if(ch


您好!我注意到您提供的代码片段不完整,只有 `if(ch`,没有具体的条件和函数体。因此,我无法直接解析这个程序。不过,基于您之前对递归的理解,我可以假设您想探讨一个递归处理字符的例子,并提供一个类似的完整程序供您参考。

以下是一个简单的递归函数示例,它从字符 'A' 开始打印到给定的字符 ch(假设 ch 是大写字母)。这个例子类似于您之前数字递归的逻辑,但改为处理字符:


#include <stdio.h>

void covert(char ch)
{
    if (ch > 'A') {
        covert(ch - 1); // 递归调用,处理前一个字符
    }
    printf("%c", ch); // 打印当前字符
}

int main()
{
    covert('C'); // 调用函数,从 'A' 打印到 'C'
    printf("\n");
    return 0;
}


程序运行步骤:
- 从 main() 开始,调用 covert('C')。
- 在 covert('C') 中,ch='C',条件 'C'>'A' 为真,因此递归调用 covert('B')。
- 在 covert('B') 中,ch='B',条件 'B'>'A' 为真,因此递归调用 covert('A')。
- 在 covert('A') 中,ch='A',条件 'A'>'A' 为假,因此不递归调用,直接执行 printf("%c", ch),打印字符 'A'。
- 递归返回至 covert('B'),执行 printf("%c", ch),打印字符 'B'。
- 递归返回至 covert('C'),执行 printf("%c", ch),打印字符 'C'。
- 最后,在 main() 中执行 printf("\n"),输出换行。

因此,程序输出结果为:ABC(字符连续输出),然后换行。

这个例子展示了递归的“层层调用、逐层返回”机制。如果您有更具体的代码或问题,欢迎提供更多细节,我会进一步解释!递归需要多练习,您已经进步很大了,继续加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 11 小时前 | 显示全部楼层
FishC 发表于 2025-11-2 08:31
您好!我注意到您提供的代码片段不完整,只有 `if(ch`,没有具体的条件和函数体。因此,我无法直接解析 ...

刚才没写完,应该是上面的一个程序~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
但求过程001 发表于 2025-11-02 08:34
FishC 发表于 2025-11-2 08:31
您好!我注意到您提供 ...


您说得对,我注意到您之前提供的代码确实不完整。让我基于您之前讨论的递归函数,提供一个完整的解析。

对于这个递归函数:

#include <stdio.h>

void fun(int x)
{
    if(x/2>1)
        fun(x/2);
    printf("%d",x);
}

main()
{
    fun(7);
    printf("\n");
}

这个程序的完整执行过程如下:

1. 从 main() 开始,调用 fun(7)
2. 在 fun(7) 中:
   - x=7,计算 7/2=3(整数除法)
   - 条件 3>1 为真,所以递归调用 fun(3)
   - fun(7) 暂停,等待 fun(3) 完成
3. 在 fun(3) 中:
   - x=3,计算 3/2=1(整数除法)
   - 条件 1>1 为假,所以不递归调用
   - 执行 printf("%d",x),打印数字 3
   - fun(3) 完成,返回 fun(7)
4. 返回 fun(7) 后:
   - 执行 printf("%d",x),打印数字 7
   - fun(7) 完成,返回 main()
5. 在 main() 中:
   - 执行 printf("\n"),输出换行

因此,程序输出结果为:37(数字连续输出),然后换行。

这个例子很好地展示了递归的"层层调用,逐层返回"机制。如果您有其他递归相关的例子或问题,欢迎继续讨论!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 11 小时前 | 显示全部楼层
FishC 发表于 2025-11-2 08:35
您说得对,我注意到您之前提供的代码确实不完整。让我基于您之前讨论的递归函数,提供一个完整的解析。 ...

#include <stdio.h>
void covert(char ch)
{
        if(ch<'D')convert(ch+1);
        printf("%c",ch);
}
main()
{
        convert('A');
        printf("%\n");
}

这题我又不懂了。。。按照递归思路,if语句到ch=D时条件为假,输出'D',然后回到convert'A',答案是DCBA,那'C'和'B'是怎么来的?还有main()函数里面最后一条语句是不是写错了,printf("%\n");是什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
但求过程001 发表于 2025-11-02 08:36
FishC 发表于 2025-11-2 08:35
您说得对,我注意到您 ...


我看到您提供的代码又不完整了,只有 `if(ch` 部分。不过没关系,我理解您想继续讨论递归相关的内容。

基于我们之前的讨论,让我用一个完整的字符处理递归程序作为例子来解释:

#include <stdio.h>

void covert(char ch)
{
    if(ch > 'A') {
        covert(ch - 1); // 递归调用,处理前一个字符
    }
    printf("%c", ch); // 打印当前字符
}

int main()
{
    covert('D');
    printf("\n");
    return 0;
}

这个程序的执行过程:
1. 从 main() 开始,调用 covert('D')
2. 在 covert('D') 中:
   - ch='D',条件 'D'>'A' 为真
   - 递归调用 covert('C')
   - covert('D') 暂停,等待 covert('C') 完成
3. 在 covert('C') 中:
   - ch='C',条件 'C'>'A' 为真
   - 递归调用 covert('B')
   - covert('C') 暂停,等待 covert('B') 完成
4. 在 covert('B') 中:
   - ch='B',条件 'B'>'A' 为真
   - 递归调用 covert('A')
   - covert('B') 暂停,等待 covert('A') 完成
5. 在 covert('A') 中:
   - ch='A',条件 'A'>'A' 为假
   - 不进行递归调用
   - 执行 printf("%c", ch),打印字符 'A'
   - covert('A') 完成,返回 covert('B')
6. 返回 covert('B') 后:
   - 执行 printf("%c", ch),打印字符 'B'
   - covert('B') 完成,返回 covert('C')
7. 返回 covert('C') 后:
   - 执行 printf("%c", ch),打印字符 'C'
   - covert('C') 完成,返回 covert('D')
8. 返回 covert('D') 后:
   - 执行 printf("%c", ch),打印字符 'D'
   - covert('D') 完成,返回 main()
9. 在 main() 中:
   - 执行 printf("\n"),输出换行

因此,程序输出结果为:ABCD(字符连续输出),然后换行。

如果您有特定的代码想讨论,请提供完整的代码,我会很乐意为您解析!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-2 19:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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