递归本质上还是一种函数的嵌套调用。
底下是几个关于递归的一些常见应用的小例子。
1.斐波那契数列,递归在递推上的应用。
/*递推用递归来求解时,主要找最后一步怎么来求解和边界条件,即第一步*/
1 int fibonacci(int n) 2 { 3 if(n==1||n==2) 4 return 1; 5 else 6 return (n+fibonacci(n-1)+fibonacci(n-2)); 7 }
2.十进制转二进制
1 void convert(int n) 2 { 3 int m; 4 if(n!=0)//当等于0时n为1或者0,直接输出 5 { 6 7 convert(n/2); 8 9 printf("%d",n%2);//输出放在递归调用之后,因为输出是反向的 10 11 } 12 else 13 printf("%d",n); 14 }
3.汉诺塔问题
1 void hanoi(int n,char x,char y,char z) 2 { 3 /*第一次直接从x移到z 4 第二次先从x移到y,再从x移到z,最后从y移到z 5 第三次先将前两个借助z从x移到y,再将x移到z,在把y上的两个借助x移到z 6 ...... 7 类推。 */ 8 if(n==1) 9 printf("%c-->%c ",x,z); 10 else 11 { 12 hanoi(n-1,x,z,y); 13 printf("%c-->%c ",x,z); 14 hanoi(n-1,y,x,z); 15 } 16 }
4.从(0,0)到(m,n)走只能向上或者向右走,一次只能走一步有多少种走法 (利用递归把问题化为缩小了的同类问题的子问题)
1 int fun(int m,int n) 2 { 3 if(m==0&&n==0) 4 { 5 return 0; 6 } 7 else if(m==0||n==0) 8 return 1; 9 else 10 return (fun(m-1,n)+fun(m,n-1)); 11 }