一道VC++递归函数题 求解!!

一道VC++递归函数题 求解!!,第1张

int sumLessThan(int start,int max,int sum)

{

if(sum<max)

{

sumLessThan(start+1,max,sum+startstart);

}else

{

return start-1;

}

}

还真是想了一会···用递归的方式向真不太好想。循环的就容易了。

int sumLessThan(int max)

{

int sum = 0;

int i = 1;

for(;sum+ii<max;i++)

{

}

return i-1;

}

lz可以对比下这两种写法,就可以发现,递归函数其实和for循环很相似,只不过变换了种形式,让for循环循环体执行的 *** 作封装到递归函数内部,然后通过条件判断退出。

所以这里的递归函数给的参数够多,基本上和for循环中括号里的变量是对应的。任何for循环都可以通过递归函数来模拟,就是看你有没有那个心情了,有的语言还就是这么干的,完全用递归代替循环结构。

想的时候只要记住,用递归模拟for循环就好了。for循环里的循环控制变量都用参数给出来,再想怎么变形合适。

lz自己测试下对不对吧,我自己没测试过。

递归,就是在运行的过程中调用自己。

构成递归需具备的条件:

函数嵌套调用过程示例

1 子问题须与原始问题为同样的事,且更为简单;

2 不能无限制地调用本身,须有个出口,化简为非递归状况处理。

在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。

例如,下列为某人祖先的递归定义:

某人的双亲是他的祖先(基本情况)。某人祖先的双亲同样是某人的祖先(递归步骤)。斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21 I[1]

斐波纳契数列是典型的递归案例:

递归关系就是实体自己和自己建立关系。

Fib(0) = 1 [基本情况] Fib(1) = 1 [基本情况] 对所有n > 1的整数:Fib(n) = (Fib(n-1) + Fib(n-2)) [递归定义] 尽管有许多数学函数均可以递归表示,但在实际应用中,递归定义的高开销往往会让人望而却步。例如:

阶乘(1) = 1 [基本情况] 对所有n > 1的整数:阶乘(n) = (n 阶乘(n-1)) [递归定义] 一种便于理解的心理模型,是认为递归定义对对象的定义是按照“先前定义的”同类对象来定义的。例如:你怎样才能移动100个箱子?答案:你首先移动一个箱子,并记下它移动到的位置,然后再去解决较小的问题:你怎样才能移动99个箱子?最终,你的问题将变为怎样移动一个箱子,而这时你已经知道该怎么做的。

如此的定义在数学中十分常见。例如,集合论对自然数的正式定义是:1是一个自然数,每个自然数都有一个后继,这一个后继也是自然数。

德罗斯特效应是递归的一种视觉形式。图中女性手持的物体中有一幅她本人手持同一物体的小,进而小中还有更小的一幅她手持同一物体的,依此类推。

德罗斯特效应

又例如,我们在两面相对的镜子之间放一根正在燃烧的蜡烛,我们会从其中一面镜子里看到一根蜡烛,蜡烛后面又有一面镜子,镜子里面又有一根蜡烛……这也是递归的表现。

如果n为13,二进制为1101

那么程序执行是这样的:

dtob(13)

{

13的二进制为1101,去掉最后一位后变成110,即13/2=6,进行dtob(6)

输出最后一位1,即13%2=1

}

dtob(6)

{

13的二进制为110,去掉最后一位后变成11,即6/2=3,进行dtob(3)

输出最后一位0,即6%2=0

}

dtob(3)

{

13的二进制为11,去掉最后一位后变成1,即3/2=1,进行dtob(1)

输出最后一位1,即3%2=1

}

dtob(1)

{

13的二进制为1,去掉最后一位后没有了

输出最后一位1,即3%2=1

}

最后就是

dtob(13)

{

    dtob(6)

    {

        dtob(3)

        {

            dtob(1)printf 1  -------1

            printf 1  --------------1

        }

        printf 0 -------------------0

    }

    printf 1 -----------------------1

}

例:求最小公约数(Gcd)

Function Gcd(x,y:longint):longint;

if y = 0 then Gcd:=a;

Else Gcd:=(y, x mod b);

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/12153733.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存