※ [本文轉錄自 b97902HW 看板]
作者: silentvow (沉沒) 看板: b97902HW
標題: [計程] 遞迴的常見錯誤
時間: Mon Oct 13 23:25:34 2008
這是一份簡單合法並使用遞迴的程式碼,以下是常見的錯誤情況。
#include <stdio.h>
int func(int a){
if(a==0)
return 0;
return func(a-1) + 1;
}
void main(){
int n;
scanf("%d", &n);
printf("%d\n", func(n));
} 前面的,小抄傳過來
● (振筆疾書) \
║\ ◥ ● ● ● ●
▆\\ ︻︶ ║ ︻︶ ║ ︻︶ ║ ︻︶ ║
H//▆ H//▆ H//▆ H//▆
1. 沒有回傳值
#include <stdio.h>
int func(int a){
if(a==0)
return 0;
func(a-1) + 1;
}
void main(){
int n;
scanf("%d", &n);
printf("%d\n", func(n));
}
居然給我白紙 ...
● \
║\ ◥ ● ● ● ●
▆\\ ︻︶ ║ ︻︶ ║ ︻︶ ║ ︻︶ ║
H//▆ H//▆ H//▆ H//▆
2. 沒有基底或結束條件
#include <stdio.h>
int func(int a){
return func(a-1) + 1;
}
void main(){
int n;
scanf("%d", &n);
printf("%d\n", func(n));
}
幹沒帶啦 前面的不借我就舉發你
● / \
║\ ◥ ● ● ● ●
▆\\ ︻︶ ║ ︻︶ ║ ︻︶ ║ ︻︶ ║
H//▆ H//▆ H//▆ H//▆
3. 遞迴傳入值錯誤
#include <stdio.h>
int func(int a){
if(a==0)
return 0;
return func(a+1) + 1;
}
void main(){
int n;
scanf("%d", &n);
printf("%d\n", func(n));
}
拎北是牆壁啦
\
後面的,小抄傳過來 |
● \ |
║\ ◥ ● ● ● ● |
▆\\ ︻︶ ║ ︻︶ ║ ︻︶ ║ ︻︶ ║ |
H//▆ H//▆ H//▆ H//▆ |
4. 使用在不同函式內宣告的變數
#include <stdio.h>
int func(int a){
if(a==0)
return 0;
return func(n-1) + 1;
}
void main(){
int n;
scanf("%d", &n);
printf("%d\n", func(n));
}
這小抄是用哪國語言寫的 ...
● \
║\ ◥ ● ● ● ●
▆\\ ︻︶ ║ ︻︶ ║ ︻︶ ║ ︻︶ ║
H//▆ H//▆ H//▆ H//▆
5. 宣告和全域變數相同名稱的變數
#include <stdio.h>
int a;
int func(int a){
if(a==0)
return 0;
return func(a-1) + 1;
}
void main(){
int n;
scanf("%d", &n);
printf("%d\n", func(n));
}
怎麼有筆跡不一致的兩種答案?!
● \
║\ ◥ ● ● ● ●
▆\\ ︻︶ ║ ︻︶ ║ ︻︶ ║ ︻︶ ║
H//▆ H//▆ H//▆ H//▆
6. 基底不正確
#include <stdio.h>
int func(int a){
if(a==0)
return -1;
return func(a-1) + 1;
}
void main(){
int n;
scanf("%d", &n);
printf("%d\n", func(n));
}
真蠢,沒發現那是上一章的小抄
● / (埋頭狂寫)
║\ ◥ ● ● ● ●
▆\\ ︻︶ ║ ︻︶ ║ ︻︶ ║ ︻︶ ║
H//▆ H//▆ H//▆ H//▆
7. 溢位
#include <stdio.h>
int func(int a){
if(a==0)
return 0;
return func(a-1) + 1;
}
void main(){
printf("%d\n", func(2147483647));
}
屁啦 ... 哪來這麼多人
\
● ● ● ● ● ● ● ● ● ●
︻︶ ║︻︶ ║︻︶ ║︻︶ ║︻︶ ║︻︶ ║︻︶ ║︻︶ ║︻︶ ║︻︶ ║
H//▆ H//▆ H//▆ H//▆ H//▆ H//▆ H//▆ H//▆ H//▆ H//▆
寫程式碼出錯是常有的事,找出並修正它才會有所成長。
現在放棄的話,比賽就結束了。