1、遞迴就是函式呼叫函式本身,執行起來就是函式巢狀函式,層層巢狀,所以函式呼叫、引數堆疊都是不小的開銷,但是程式簡單。
2、非遞迴就是不斷地對引數入棧、出棧,省去了函式層層展開、層層呼叫的開銷。雖然引數出入棧次數多了,但是一般都開闢固定的足夠大的記憶體來一次性開闢、重複使用。
3、非遞迴是從堆疊的角度來編寫程式,速度快,但**複雜。
遞迴是從問題本身的邏輯角度來編寫,雖然速度相對慢,但**容易理解。
對於同乙個問題,如果對速度要求不高,建議用遞迴方式。
1.遞迴和非遞迴分別實現求第n個斐波那契數。
首先對於斐波那契數序列:1 1 2 3 5 8 13 21 34… 從第三項開始,每一項都等於前兩項之和。
int count = 0; //計數計算多少次f1
int fabonaci(int n) //遞迴
else }
int main()
int fabonaci(int n) //非遞迴
return f3;
}int main()
2.遞迴和非遞迴分別實現strlen
strlen遇到\0停止,引用陣列引進標頭檔案,字串的長度就是字元個數。
#includeint count = 0;
int mystrlen1(char *str) //非遞迴
return count;
}int main()
int mystrlen(char *str) //遞迴
else }
int main()
3.遞迴和非遞迴分別實現求n的階乘
int fac(int n)//5! = 5*4! 5*4*3!
else }
int main()
4.遞迴實現n^k
int mypow(int n, int k) //遞迴
else }
int main()
5.遞迴方式實現列印乙個整數的每一位
void print(int n) //123
printf("%d ", n % 10);
}int main()
6寫乙個遞迴函式digitsum(n),輸入乙個非負整數,返回組成它的數字之和
int digitsum(int n)
else//14 123 }
int main()
遞迴的過程是***先遞後歸*** 1729 172 17 1為遞過程 ; 1 7 2 9為歸過程
7.編寫乙個函式 reverse_string(char * string)(遞迴實現)
void reverse_string(char *p) //遞迴
*(p + len - 1) = tmp; // *p 和 *(p+len-1) 進行交換
}int main()
void reverse_string(char *str) //非遞迴
}int main()
遞迴 非遞迴
遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題 例如 hanio塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此 在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問題 另外,有些程式語言不支援...
堆排序遞迴和非遞迴
完全二叉樹 葉子節點在最後一層或者次一層,且節點從左往右連續 大根堆 任何根節點都比他的左右子節點都要大 i為節點在陣列中的索引,求節點的父節點 i 1 2,求節點的左節點 i 2 1,求節點的右節點 i 2 2 測試方法 test public void test heapify2 array s...
遞迴轉非遞迴
題目描述 給定乙個列表,該列表中的每個要素要麼是個列表,要麼是整數。將其變成乙個只包含整數的簡單列表。如果給定的列表中的要素本身也是乙個列表,那麼它也可以包含列表。您在真實的面試中是否遇到過這個題?樣例給定 1,2,1,2 返回 1,2,1,2 給定 4,3,2,1 返回 4,3,2,1 挑戰請用非...