/* 函数递归: 什么是函数递归? 程序调用自身的编程技巧称为递归。 递归作为一种算法在程序设计语言中广泛应用; 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法; 通常把一个大型复杂的问题层层转化为一个与原问题相似规模较小的问题来求解,递归策略只需少量的程序就可描述出解决过程 所需要的多次重复计算,大大的减少了程序的代码量。 递归的主要思考方式:把大事化小 递归的两个必要条件 A.存在限制条件,当满足这个限制条件的时候,递归便不再继续 B.每次递归调用之后便越来越接近这个限制条件 Exercise A 接收一个无符号整形,按照顺序打印它的每一位 EG:输入1234 输出1 2 3 4 #include <stdio.h> void print(int n) { if(n>9) { print(n/10); } printf("%d ", n%10); } int main() { int num = 0; printf("请输入你所要打印的数\n"); scanf("%d",&num); print(num); return 0; } Exercise B 求一个字符串的长度 先了解指针变量的意思 #include <stdio.h> int main() { int a=0;//a是int类型,在内存中分配4个字节的空间 printf("%p\n",&a);//%p是专门来打印地址的 int *pa=&a;//pa是用来存放地址的,pa叫指针变量 // *说明pa是指针变量 //int说明pa指向的对象是int类型的 return 0; } 调用库函数运用链式访问轻松求出arr字符串的长度 #include <stdio.h> #include <string.h> int main() { char arr[]="Treasure"; printf("%d",strlen(arr)); return 0; } 写一个函数来求一个字符串的长度 #include <stdio.h> int mystrlen(char *str) { int number=0; while (*str != '\0') { str++; number++; } return number; } int main() { char arr[]="Treasure"; printf("%d",mystrlen(arr)); //数组名相当于首元素的地址,即T的地址,数组名在传参的时候,传的是首元素的地址, //T是字符,所以是字符的地址char *str //字符的地址要放在字符的指针变量里面*str return 0; } 写一个程序不允许创建临时变量来求一个字符串的长度 #include <stdio.h> int mystrlen(char *str) { if (*str != '\0') return 1+mystrlen(str+1); else return 0; } int main() { char arr[]="Treasure"; printf("%d",mystrlen(arr)); return 0; } 递归与迭代 求n的阶乘(不考虑溢出) #include <stdio.h> int main() { int n=0; scanf("%d",&n); int ret=1; for (int i = 1; i <=n ; i++) { ret=ret*i; } printf("%d\n",ret); return 0; } int fan(int i) { if (i<=1) return 1; else return fan(i-1)*i; } #include <stdio.h> int main() { int n=10; fan(n); printf("%d",fan(n)); return 0; } 计算第n个斐波那契数(不考虑溢出)//递归的次数太多 int fib(int i) { if (i<=2) return 1; else return fib(i-1)+fib(i-2); } #include <stdio.h> int main() { int n=0; scanf("%d",&n); fib(n); printf("%d", fib(n)); } int fib(int i) { int a=1; int b=1; int c=1; while (i>2) { c=a+b; a=b; b=c; i--; } return c; } #include <stdio.h> int main() { int n=0; scanf("%d",&n); fib(n); printf("%d", fib(n)); } 计算一道例题: long fact(int n) { long f; if (n==1) f=1; else f=n*fact(n-1); return f; } #include <stdio.h> int main() { long y; int m; printf("请输入一个正整数:\n"); scanf("%d",&m); y=fact(m); printf("%d != %ld\n",m,y); return 0; } */