快捷搜索:  汽车  科技

递归算法能不能转化为非递归算法:算法单递归减而治之

递归算法能不能转化为非递归算法:算法单递归减而治之#include <stdio.h> int Sum(int arr[] int size) { if(size<1) return 0; return arr[size-1] Sum(arr size-1); // 单递归,线性递归 } int main() { int arr[] = {1 2 3 4 5}; int n = sizeof arr / sizeof *arr; printf("%d\n" Sum(arr n-1)); getchar(); }线性递归:demo:The control of a large force is the same principle as the control of a few men: it is merely a ques

迭代乃人工,递归方神勇。

To iterate is human to recurse divine.

(神通的原因在于编译器在背后利用函数栈帧的数据结构。)

凡治众如治寡,分数是也。

The control of a large force is the same principle as the control of a few men: it is merely a question of dividing up their numbers.

分数,可以减而治之(Decrease and conquer),也可以分而治之(Divide and conquer)。

1 减而治之

递归算法能不能转化为非递归算法:算法单递归减而治之(1)

demo:

#include <stdio.h> int Sum(int arr[] int size) { if(size<1) return 0; return arr[size-1] Sum(arr size-1); // 单递归,线性递归 } int main() { int arr[] = {1 2 3 4 5}; int n = sizeof arr / sizeof *arr; printf("%d\n" Sum(arr n-1)); getchar(); }

线性递归:

递归算法能不能转化为非递归算法:算法单递归减而治之(2)

2 分而治之

递归算法能不能转化为非递归算法:算法单递归减而治之(3)

demo:

#include <stdio.h> int Sum(int arr[] int lo int hi) { if(lo==hi) return arr[lo]; int mid = (lo hi)>>1; return Sum(arr lo mid) Sum(arr mid 1 hi); // 双递归,二叉树形式递归 } int main() { int arr[] = {1 2 3 4 5}; int n = sizeof arr / sizeof *arr; printf("%d\n" Sum(arr 0 n-1)); getchar(); }

二叉树形式递归:

递归算法能不能转化为非递归算法:算法单递归减而治之(4)

-End-

猜您喜欢: