1.工具cpulspuls.com 程序员知乎:stack overflow.com23
2.递归——程序调用自身的编程技巧称为递归
史上最简单的递归
int main()
{
printf("hehe\n");
main();
return 0;
}
递归常见的错误:栈溢出——
例子1:
#include <stdio.h> void printf(int n) { if(n>9) { print(n/10); } printf("%d ",n%10);
} int main() { unsigned int num = 0; scanf("%d",&num);//1234 //递归 print(num);
return 0;
}
例子2,编写函数不允许创建临时变量,求字符串的长度
int my_strlen(char* str)
{
if(*str != '\0')
return 1+my_strlen(str+1);
else
return 0;
}
int main()
{
char arr[] = "arr";
int len = my_strlen(arr);
printf("%d\n",len);
return 0;
}
例子3:求n的阶乘
方法1-----递归方法
int Fac2(int n)
{
if(n<=1)
return 1;
else
return n*Fac2(n-1);
}
int main()
{
//求n的阶乘
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fac2(n);//循环的方式
printf("%d\n", ret);
return 0;
}
方法2----非递归法
int Fac1(int n)
{
int i = 0;
int ret = 1;
for(i=1; i<=n; i++)
{
ret *=i;
}
return ret;
}
int main()
{
//求n的阶乘
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fac1(n);//循环的方式
printf("%d\n", ret);
return 0;
}
例子4:求斐波那契数列 1 1 2 3 5 8 13 21 34 55.........(前两个数的和等于第三个数)
/*int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while(n>2)
{
c = a+b;
a=b;
b=c;
n--;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
//TDD - 测试驱动开发
printf("ret = %d\n", ret);
//printf("count = %d\n", count);
return 0;
}*/
汉诺塔问题
A小移到C,A中移B,C小移动到B,A大移动到C,B小移动到A,B中移动到C,A小移动到C
青蛙跳台阶问题
共n个台阶1次跳一个台阶或两个台阶
这只青蛙要跳到第N个台阶,有多少种跳法
《剑指offer》