寺院網(wǎng)站建設(shè)谷歌網(wǎng)站收錄提交入口
目錄
遞歸使用場景
1:使用遞歸的方式計(jì)算? ?Sn=1+2+3+..+100
2:計(jì)算 n!=n*(n-1)*(n-2)*......*1;
3:計(jì)算輸出斐波那契數(shù)列前20項(xiàng),并按每行4個(gè)數(shù)的格式輸出(2019年)
4: 用遞歸和非遞歸兩種方式編寫函數(shù)strlength()。該函數(shù)與庫函數(shù)strlen()功能相同。返回參數(shù)字符串的長度(整形),不允許調(diào)用任何庫函數(shù).(2015年)
遞歸使用場景
問題有規(guī)律可循:通向公式
具有遞歸的結(jié)束條件:明確的值
遞歸框架:if配合
結(jié)束條件成立,返回已知值(結(jié)束遞歸)
結(jié)束條件不成立,進(jìn)行遞歸
?
1:使用遞歸的方式計(jì)算? ?Sn=1+2+3+..+100
?通向 公式? ? 如果? n=1 返回1?
否則返回? ?n+f(n-1)
#include<stdio.h>
int add(int n)
{if (n== 1) return 1;else return n + add(n - 1);
}
void main()
{printf("%d", add(100));
}
2:計(jì)算 n!=n*(n-1)*(n-2)*......*1;
找通向公式? ? ? 當(dāng)n=0或者1 的時(shí)候?yàn)榻K止條件返回1? ? ?
否則? n*(n-1)!
#include<stdio.h>
int fac(int n)
{if (n == 1) return 1;else return n*fac(n-1);
}
void main()
{printf("%d", fac(3));
}
3:計(jì)算輸出斐波那契數(shù)列前20項(xiàng),并按每行4個(gè)數(shù)的格式輸出(2019年)
?找通向公式? ? ? n=1 的時(shí)候返回1? ? ? ?n =2的時(shí)候返回1
否則就返回? ? ? 前兩項(xiàng)之和? ? ? ? ? f(n-1)+f(n-2)
#include<stdio.h>
int fib(int n)
{if (n == 1|| n==2) return 1;else return fib(n - 1) + fib(n - 2);
}void main()
{int i;for (i = 1; i <= 20; i++) {printf("%8d", fib(i));if (i % 4 == 0) printf("\n"); }
4: 用遞歸和非遞歸兩種方式編寫函數(shù)strlength()。該函數(shù)與庫函數(shù)strlen()功能相同。返回參數(shù)字符串的長度(整形),不允許調(diào)用任何庫函數(shù).(2015年)
字符串長度不包括\0?
把字符串一點(diǎn)一點(diǎn)弄短? 大事化小事
//不適用遞歸
int strlength(char *s)
{int n = 0;while (*s++) n++;return n;
}
#include<stdio.h>
//遞歸方式(大事化小)
int strlength(char *s)
{if (*s=='\0') return 0;else return 1 + strlength(s+1);//往后挪一個(gè)(這里是地址加1)
}
void main()
{char s[100];gets(s);printf("%d", strlength(s));
}