- 1.接受一個整形值(無符號),把它轉換為 字符并打印它
- 模擬實現strlen()函數。
- 3.求n的階乘
- 4.斐波那契數列
- 總結
1.接受一個整形值(無符號),把它轉換為 字符并打印它
void fun(int x)
{if (x > 9){fun(x/10);}printf("%d\n", x%10);}
int main()
{int a = 1234;fun(a);system("pause");return 0;
}
我們來看一下遞歸的過程
這時我們是不是可以理解了輸出的結果
模擬實現strlen()函數。
int my_strlen(char *str)
{if (*str == '\0'){return 0;}else{return 1 + my_strlen(str+1);//return 1 + my_strlen(str++);//str++的副作用,每次傳過去的都是str}}
int main()
{char str1[] = "abcdefghijklmnopqrstuvwxyz";printf("%d", my_strlen(str1));system("pause");return 0;}
我們來看一下這個函數
int my_strlen(char *str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str+1);
}
遞歸很好用,但是要多多練習理解調用的過程
3.求n的階乘
int factorial(int x)
{if (x <= 1)return 1;elsereturn x* factorial(x - 1);
}
int main()
{int x = 5;factorial(x);system("pause");return 0;
}
4.斐波那契數列
int fib(int x)
{if (x <= 2)return 1;elsereturn fib(x - 1) + fib(x - 2);
}
int main()
{int x = 4;printf("%d",fib(x));system("pause");return 0;
}
棧溢出(死遞歸):系統分配給程序的棧空間是有限的,在死循環和死遞歸的情況下,一直在開辟棧空間,最終導致棧空間耗盡。
總結
- 很多問題用遞歸解決比非遞歸解決更清楚,也更容易實現
- 遞歸實現問題在處理較大數據時,由于無限次調用自己容易導致棧溢出,所以它的效率會比迭代法低
- 迭代是更新變量的舊值。遞歸是在函數內部調用自身