计算化学公社

标题: fortran中的递归程序耗时吗? [打印本页]

作者
Author:
an2000    时间: 2024-4-9 10:34
标题: fortran中的递归程序耗时吗?
目前在代码中写了一个递归子程序,运行起来非常耗时,请问大家,是否有必要将该递归子程序改成循环?谢谢!
作者
Author:
lyj714    时间: 2024-4-9 12:06
这个自己测试不就好了。算法中,递归本身就是反复开栈的过程,如果你写的程序递归深度很大,自然耗时间。
作者
Author:
an2000    时间: 2024-4-9 15:15
lyj714 发表于 2024-4-9 12:06
这个自己测试不就好了。算法中,递归本身就是反复开栈的过程,如果你写的程序递归深度很大,自然耗时间。

好的谢谢
作者
Author:
node101    时间: 2024-7-28 22:15
科学计算里非必要不要用递归吧
作者
Author:
an2000    时间: 2024-9-4 19:50
node101 发表于 2024-7-28 22:15
科学计算里非必要不要用递归吧

好滴谢谢
作者
Author:
Daniel_Arndt    时间: 2024-12-9 10:35
递归改循环的话,理论上可以,但一般这么做的都是偏计算机专业的人士。

作为化学专业的话,有两个较短时间内适用的方案,一个是用OpenMP的task来加速递归,既然你的程序是用Fortran写的,肯定是可以用OpenMP在多核处理器上加速的。美国的ACCESS(之前叫XSEDE)的OpenMP workshop里会提到这一点,具体就是看CMU的并行计算专家John Urbanic写的教程(他就是ACCESS的OpenMP workshop的授课者,他的这些slides就是授课时用的) https://www.psc.edu/resources/training/openmp-workshop/ 中的Advanced OpenMP一节。如果觉得用OpenMP的task进行调度太难的话(John Urbanic本人也说过绝大多数情况下用OpenMP加速一下for循环就可满足要求,用到OpenMP的task的情况往往是为线性代数库、numpy贡献代码),那就只能用第二个方案,就是在科学计算中尽量避免写出用递归的代码。
作者
Author:
an2000    时间: 2025-1-7 09:49
Daniel_Arndt 发表于 2024-12-9 10:35
递归改循环的话,理论上可以,但一般这么做的都是偏计算机专业的人士。

作为化学专业的话,有两个较短时 ...

太感谢了!谢谢您给出的建议。
作者
Author:
sgwzq    时间: 2025-12-27 01:37
这个问题我确实也好奇过,在网上搜是这样的
https://fortranwiki.org/fortran/show/recursion
Fortran 77在出现的时候,可能就没想过操作系统、栈之类的东西(Linux Windows都是用C写出来的,它们都是C出现后的产物)
所以原生的77是不支持递归的。只有一些implementions比如gfortran有它们自己的语法。
至于实现的原理更不清楚了。据这个网站所说,Fortran的递归比C慢很多,这个和C在引用调用、传值调用的设计有关。
另外,一切递归都可以改为循环。只不过是把编译器分配的栈变成你手动分配的栈数组。
如果你对这个比较感兴趣,你可以用必应或者google搜一下一个排序算法
quicksort 和它的循环版本 iterative quicksort
在geeksforgeeks就有它们的代码,很容易理解。
把递归展开成循环,有利于性能提升,不管是C还是Fortran.




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3