求C语言递归资料
最近在研究C语言递归,哪位有这方面资料的?最好是带详细分析的那种,有些递归自己看还是看不太懂,求助啊。。
其实不存在什么资料不资料,
我曾经也在递归迷茫了挺久。
递归其实就是在重复做同一个动作。
它能重复一次改变一次所有参数的值,然后继续重复。
递归最难的地方是如何正确的结束递归。
程序代码:#include <stdio.h>
int factorial(int n) {
if(n == 0) return 1;
return n * factorial(n - 1);
}
int main() {
int n;
scanf("%d", &n);
printf("%d\n", factorial(n));
return 0;
}递归2:Fibonacci
程序代码:#include <stdio.h>
int fibonacci(int n) {
if(n <= 1) return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main() {
int n;
scanf("%d", &n);
printf("%d\n", fibonacci(n));
return 0;
}
递归3:Ackerman
程序代码:#include <stdio.h>
int ackerman(int n, int m) {
if(n == 1 && m == 0) return 2;
if(n == 0 && m >= 0) return 1;
if(n >= 2 && m == 0) return n + 2;
return ackerman(ackerman(n -1, m), m - 1);
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
printf("%d\n", ackerman(n, m));
return 0;
}
递归4:全排列
程序代码:#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a; *a = *b; *b = temp;
}
void perm(int a[], int k, int m) {
int i;
if(k == m) {
for(i = 0; i <= m; printf("%d", a[i++])) ;
printf("\n");
}
else for(i = k; i <= m; i++) {
swap(&a[k], &a[i]);
perm(a, k + 1, m);
swap(&a[k], &a[i]);
}
}
int main() {
int a[] = {1, 2, 3};
perm(a, 0, 3 - 1);
return 0;
}
递归5:整数划分
程序代码:#include <stdio.h>
int q(int n, int m)
{
if((n < 1) || (m < 1)) return 0;
if((n == 1) || (m == 1)) return 1;
if(n < m) return q(n, n);
if(n == m) return q(n, m-1) + 1;
return q(n, m-1) + q(n-m, m);
}
int main()
{
int m;
scanf("%d", &m);
printf("%d", q(m, m));
return 0;
}
递归6:Hanoi
程序代码:#include <stdio.h>
void move(char a, char b) {
printf("%c---%c\n", a, b);
}
void hanoi(int n, char a, char b, char c) {
if(n > 0) {
hanoi(n - 1, a, c, b);
move(a, b);
hanoi(n - 1, c, b, a);
}
}
int main() {
int n;
scanf("%d", &n);
hanoi(n, 'a', 'b', 'c');
return 0;
}
一般教材上都有这些的...