注册 登录
编程论坛 C语言论坛

利用递归的方法编程实现:用户输入一个整数,如输入235,则程序顺序输出2 3 5。下面的程序能否给个注释,看不懂!谢谢大佬!

abc594986308 发布于 2020-01-11 23:14, 4756 次点击
程序代码:
#include <stdio.h>
void p(int);
int main(void)
{
    int n;
    printf("输入一个整数\n");
    scanf("%d",&n);
    p(n);
}
void p(int n)
{
    if(n/10 == 0)
    {
        printf("%d ",n);
        return;
    }
    p(n/10);
    printf("%d ",n%10);
}
20 回复
#2
叶纤2020-01-11 23:34
你贴图容易被封号哦
#3
abc5949863082020-01-11 23:53
回复 2楼 叶纤
啥意思啊
你能解就解
#4
叶纤2020-01-12 01:34
没有什么意思啊,就是前两天看到了一个网址怕你被封提醒一下
https://bbs.bccn.net/thread-488292-1-1.html
这题还可以啊能看的明白啊不难啊
分解起来就是
p(p(p(n/10)))
{if(..)
printf n%10}//因为printf  后是有空的所以结果为空n
#5
叶纤2020-01-12 01:42
原来这种的叫递归函数啊我也学到了
#6
叶纤2020-01-12 01:45
如果楼主还是看不懂我就写个数字吧
p(n)       2     23      235
n%10     2     3           5
#7
叶纤2020-01-12 01:51
如果还是不懂,你就把他当做for循环
#8
xianfajushi2020-01-12 02:19
递归与堆栈的关系,堆栈出入先后的关系。
递归过程是一种调用自身的函数,在调用的过程中存在转入子程序的过程。在每次转子前需要保护现场,则将相应参数和中间结果压入系统堆栈,而在子程序返回的时候,需要恢复现场,则将之前压栈的数据从系统堆栈弹出,因此,递归过程存在隐含的堆栈操作,而且子程序的调用过程满足堆栈先进后出的特性。
void p(int n)
{
    if(n/10 == 0)
    {
        printf("%d ",n);当只有一位数时
        return;结束递归
    }
    p(n/10);123/10=12/10=1
    printf("%d ",n%10);显示尾数,显示1,显示2,显示3,体现先入后出或后入先出这2种说法一个意思。
}

[此贴子已经被作者于2020-1-12 02:25编辑过]

#9
叶纤2020-01-12 02:56
呀楼上的也没睡啊,也附赠我的循环图吧,花了我很长时间
只有本站会员才能查看附件,请 登录
#10
吹水佬2020-01-12 09:11
递归,入栈出栈,后入先出。
#11
forever742020-01-12 09:23
程序代码:

void p(int n)
{
    p2(n/10);
    printf("%d ",n%10);
}
void p2(int n)
{
    p3(n/10);
    printf("%d ",n%10);
}
void p3(int n)
{
    if(n/10 == 0)
    {
        printf("%d ",n);
        return;
    }
}

把执行不到的部分去掉,然后展开。这样是不是能看懂了?
#12
bcbbcclbbc2020-01-12 21:39
回复 8楼 xianfajushi
递归调用函数还有这个深层含义,堆栈出栈,学到了,之前一直不怎么理解,只记得一个递归调用常常和if语句合用

[此贴子已经被作者于2020-1-12 22:08编辑过]

#13
bcbbcclbbc2020-01-12 21:49
回复 2楼 叶纤
楼主的帖子只是正常的程序代码,不是贴图哦
https://bbs.bccn.net/faq.php?action=message&id=18


[此贴子已经被作者于2020-1-13 02:32编辑过]

#14
叶纤2020-01-13 03:18
回复 13楼 bcbbcclbbc
他发的不是图吗?字体怎么和我截图的字体那么像(●—●)这就尴尬啦,把人家怼了一顿,说抱歉都没地说
#15
叶纤2020-01-13 03:35
最主要是我是看他注册的时间挺长的,发图被封的话那会多崩溃啊,虽然只是个账号而已,但是陪伴自己的终会有感情的,
我是从这个出发点考虑的,他是从何出发点考虑的我就不知道了。不过最终目的只有一个,他求知(知识),我也是求知,他告诉我递推这个名词,我花时间学习资料用我的理解告知他知识。目的达到了就行了
#16
xianfajushi2020-01-13 10:49
使用循环可以实现递归一样还原现场的目的,就是要使用动态数组存储现场.
头上一天青天,心中一个信念
不是年少无知,只是不惧挑战
凡事求个明白,算是本性难改
可以还你公道,我又何乐不为
一些漫不经心的说话 将我疑惑解开
种种莫名其妙的冲动 叫我继续追寻
你的一举一动,我却倍加留心
只要真相大白,一切无悔于心
今朝有了这个想法,写了一下实现使用循环可以实现递归一样还原现场的目的代码运行.

[此贴子已经被作者于2020-1-13 11:06编辑过]

#17
abc5949863082020-02-03 18:46
回复 15楼 叶纤
有什么崩溃的?你以为是贴图我也没办法啊,下次看清楚就行。而且你的提醒我会注意,但是你不能解我的题就乱喷一通我就不能理解了。我没什么崩溃不崩溃的,可以封我的号啊,已经很久没玩这个论坛了,只是有时候记起来,关于这方面有疑问就会上来问一下。
#18
叶纤2020-02-05 22:44
以下是引用abc594986308在2020-2-3 18:46:45的发言:

有什么崩溃的?你以为是贴图我也没办法啊,下次看清楚就行。  而且你的提醒我会注意,但是你不能解我的题就乱喷一通我就不能理解了   。我没什么崩溃不崩溃的,可以封我的号啊,已经很久没玩这个论坛了,只是有时候记起来,关于这方面有疑问就会上来问一下。

首先,感谢您隔了半个世纪回复我,我理解你的感受,谁被误解了都会很火大,不过先建议您消消气,
关于你贴图那个情况确实是我看错了,截至今天我才会使用怎么使代码变得有颜色,不过您当时字体偏粗会误认为是截图,我也是想能复制粘贴到我的编译器早点替你解决问题,可是等来的不是你的代码,而是您被误解时的火大,我就想了,我替你考虑问题,你咋还发起火了,后来有位版主提醒我这个不是图,我才明白你为什么火大,所以我第一时间向您道了谦,如果您没看到,那我再道一次谦吧::对不起,
2、您说我没能解你的题?这我就不明白了,因为误认为你发的是图片,我熬夜把您的代码手敲了一遍,而且还把循环图以及注释都给你了,额,我只能想到您只是火大的只看到后面几个评论,没仔细研究我给你的解题步骤,如果您仔细研究应该会理解递归,反正我能用递归写出汉诺塔了,大哥哥,别生妹妹的气了嘛,咱们一起努力,共同进步好不好?
#19
叶纤2020-02-05 23:10
编程中国是我第一个论坛也是我唯一一个论坛,这个号如果被封了我不会像楼主一样那么强大一点都不心痛,说不心痛那是假的,不仅仅他是我唯一的论坛,而是他是编程中国
#20
abc5949863082020-02-09 20:50
回复 18楼 叶纤
如果是妹子,可以优先享有谅解,你给了解释所以没怎么上火。别太上心。
#21
林月儿2020-02-10 07:10
这个图是醉了,不过先执行再复用当前函数的建议还是用循环
递归或者说是函数重入,主要关注收敛条件也就是运行结束的判断
先复用再执行的场景比较多,所以循环做起来有困难的可以考虑这个递归
建议不要上来就采用递归
下面举两个例子
比如
程序代码:
#include<stdio.h>
void trace(int n){
    if(n>0){//收敛条件
        trace(n-1);//函数重入
        printf("%d",n);
    }
}
int main(){
    trace(4);
}

这里就是,每次先不停的纵深,直到倒数第二步n=1,执行trace(0)判断false无输出
然后开始倒扒皮慢慢往外退,继续上一轮trace(n-1)下面的任务

下面是高中的排列组合的例子,可以试着分析下
程序代码:
#include<stdio.h>
void trace(int arr[],int len,int arr2[],int len2,int size)
{
    if(len2>=size)
    {
        for(int i=0;i<size;i++)
            printf("%d\t",arr2[i]);
        printf("\n");
        return;
    }
    for(int i=0;i<len;i++)
    {
        if(len2==0||arr[i]>arr2[len2-1])
        {
            arr2[len2]=arr[i];
            trace(arr,len,arr2,len2+1,size);
        }
    }
}
int main()
{
    int arr[4]={1,2,3,4};
    int arr2[4];
    trace(arr,4,arr2,0,3);
}

1