c语言中函数的递归

题目:用递归法把一个整数转换成字符串输出。

比较下面两种方法的不同:

 putchar(n%10+‘0‘)的位置不同,造成输出结果的不同。

方法一:

 1 #include <stdio.h>
 2 void convert(int n)
 3 {
 4 int i;
 5 if((i=n/10)!=0)
 6 convert(i);
 7 putchar(n%10+‘0‘);
 8
 9 }
10 main()
11 {
12 int n;
13 printf("请输入一个整数n:\n");
14 scanf("%d",&n);
15 if(n<0)
16 {
17 n=-n;
18 putchar(‘-‘);
19 convert(n);
20 }
21 else
22 {
23 convert(n);
24 }
25
26 }

输入:123

输出:123

程序先是从main开始从上到下顺序执行,到convert(123).执行到if((i=n/10)!=0)  convert(i);

从而去调用convert(12);convert(12)从上到下顺序执行,n/10=1;又去调用convert(1);convert(1)从上到下顺序

执行,n/10=0;不满足if的条件,执行printf(n%10+‘0‘),为1;至此,convert(1)函数执行结束,然后返回到convert(12)去执行它未完成的部分,printf(n%10+‘0‘);输出2;convert(12)执行完毕,返回到convert(123)去执行它未完成的部分,printf(n%10+‘0‘)输出。所以为123.

方法二:

 1 #include <stdio.h>
 2 void convert(int n)
 3 {
 4 int i;
 5
 6 putchar(n%10+‘0‘);
 7 if((i=n/10)!=0)
 8 convert(i);
 9
10
11 }
12 main()
13 {
14 int n;
15 printf("请输入一个整数n:\n");
16 scanf("%d",&n);
17 if(n<0)
18 {
19 n=-n;
20 putchar(‘-‘);
21 convert(n);
22 }
23 else
24 {
25 convert(n);
26 }
27
28 }

输入:123

输出:321

很明显第一种是我们想要的结果,可是有时也需要逆序输出,但为什么只通过交换语句的顺序就有顺序输出,逆序输出两种效果。我觉得我现在才明白了什么是递归。递归的真正过程是什么?

时间: 2024-08-25 03:42:17

c语言中函数的递归的相关文章

C语言中函数和指针的参数传递

最近写二叉树的数据结构实验,想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个例子讨论一下c语言中指针作为形参的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个数据引用同一个数据,那么更改任意的一个都相当于更改了本体,那么另一个数据所对应的值也会改变,可是C中是没有这个概念的.所以就产生了一些东西.和我们本来想的有差别. 一.明确C语言中函数的入口: C语言中函数的形参负责接收外部数据,那么数据究竟怎么进入函数的呢,其实我们在函数体内操作的形参只是传递进来

从头开始-05.C语言中函数

函数: 完成特定功能代码段 特点:函数只有调用的时候才会执行 定义格式:返回值类型 函数名称(形参类型 形参名称,...){ 语句; ...  } 函数参数 形式参数:在定义函数的时候,函数名后面小括号中的参数 实际参数:在函数调用的时候,函数名后面小括号中的参数 注意点: 形参与实参必须一一对应 实参与形参的类型必须一致 基本数据类型作为函数参数传递是值传递 组作为函数参数传递是地址传递 指针作为函数参数传递是地址传递 结构体作为函数参数传递是值传递 返回值: return 作用: 1.结束函

C语言中函数返回数组

#include "stdio.h"/*int* set(int a,int *c){ int *b; b=malloc(sizeof(int)*3); c[0]=a; c[1]=1+a; c[2]=2+a; b[0]=13; b[1]=14; b[2]=15; return b;}*/char *set(void){ char *buf; buf=malloc(sizeof(char)*3);//创建内存区 buf[0]=0x30; buf[1]=0x31; buf[2]=0x32;

C语言中函数的分类

在C语言中函数被分为两类,一类是系统提供的标准函数,又称库函数.标准函数由系统定义,在程序中可以直接调用,例如:printf(),scanf()等.另一类是用户自己定义的函数. 用户自己定义函数要遵循一定的规则,而且定义函数它一般的格式如下: 函数类型 函数名称(形式参数表){ 说明语句序列 可执行语句序列 } 通常函数类型与函数的返回值的类型一致,函数名称的命名规则同变量命名完全一样.形式参数表是用于调用函数和被调用函数之间的数据传递,因此它也需要进行类型说明. 例如: #include <s

C语言中函数参数为什么是由右往左入栈的?

先通过一个小程序来看一看: #include void foo(int x, int y, int z) { printf("x = %d at [%X]n", x, &x); printf("y = %d at [%X]n", y, &y); printf("z = %d at [%X]n", z, &z); } int main(int argc, char *argv[]) { foo(100, 200, 300);

C语言中函数声明实现的位置

在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误 先看一段代码: #include <stdio.h> int main() { fun1(); fun1(); fun1(); fun2(); return 0; } /*方法1.用于输出消息1*/ void fun1() { printf("For he's a jolly good fellow!\n"); } /*方法2,用于输出消

C语言中函数参数入栈的顺序 - Fangzhen - 博客园

.wiz-todo, .wiz-todo-img {width: 16px; height: 16px; cursor: default; padding: 0 10px 0 2px; vertical-align: -10%;-webkit-user-select: none;} .wiz-todo-label { display: inline-block; padding-top: 7px; padding-bottom: 6px; line-height: 1.5;} .wiz-todo

C 语言中函数的跳转

1.同一个函数内,可以使用goto语句: eg: void  text_1( void ) { char i=0; a : i++; printf ( " text_1 = %d \r\n" , i); goto a ; } 2.不同函数之间的跳转,可以使用 setjmp / longjmp 函数: eg: jmp_buf   jb; char i=0; void   text_2 ( void ) { setjmp(jb);  // 保存当前AR到jb变量中 i++; printf

C语言中函数指针

函数调用的方法有两种分别如下: void Fun(void) { //do something } int main(void) { ... Fun(); ... return 0; } void Fun(void) { //do something } int main(void) { ... void (*p)(void); p=Fun; p(); return 0; } 上面两种方式都可以调用函数,第二种方式在回调函数中用的最多,尤其是在操作系统的任务切换中.那么我们就重点来分析下第二种方