【发布时间】:2016-01-06 09:15:07
【问题描述】:
继续this问题:
我在 c++ 中有一个函数,它一遍又一遍地调用自己。就是这样:
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <cmath>
using namespace std;
double g( double a, double x){
if (x>=a) return (g(a,x-1)+g(a,x-a));
else if (x<a) return 1;
return 0; //Never Reached
}
int main(){
cout << (unsigned long)g(sqrt(90),90) <<endl; // outputs 7564511
cout << (unsigned long)g(sqrt(10000019),10000019)<<endl; // Signal: SIGSEGV (Segmentation fault)
}
我想知道如何将此函数转换为某种迭代或尾循环(或任何停止段错误的方法),但更重要的是我需要知道如何自己实际执行。
注意:如果这是一个微不足道的问题,我提前道歉。
【问题讨论】:
-
这可能会对您有所帮助:codeproject.com/Articles/418776/…
-
当一个递归函数在尾调用中两次调用自己时,我认为不能转换为尾递归函数。
-
就像@RSahu 说的,这是不可能的。
-
不是真的。取决于函数的性质,例如你让斐波那契尾递归stackoverflow.com/questions/22111252/tail-recursion-fibonacci
-
@RSahu 绝对一切都可以转换为尾递归函数,谷歌“继续传递风格”。它是否对任何人都有帮助是完全不同的问题。
标签: c++ loops recursion tail-recursion