什么';在第一个练习的scala中,我的scala代码在函数编程原理中有什么问题

什么';在第一个练习的scala中,我的scala代码在函数编程原理中有什么问题,scala,Scala,我是scala初学者。我在学习。但我在做第一个练习时会遇到这个问题。以下是第一个练习: 三角形边缘的数字都是1,每个数字 三角形内部是它上面两个数字的和。写一篇 函数,该函数通过 递归过程 通过在Main.scala中实现pascal函数来完成此练习, 它接受一列c和一行r,从0开始计数并返回 三角形中那个点的数字。例如,pascal(0,2)=1, 帕斯卡(1,2)=2和帕斯卡(1,3)=3 这是我的第一个代码: package recfun object Main { def main

我是scala初学者。我在学习。但我在做第一个练习时会遇到这个问题。以下是第一个练习:

三角形边缘的数字都是1,每个数字 三角形内部是它上面两个数字的和。写一篇 函数,该函数通过 递归过程

通过在Main.scala中实现pascal函数来完成此练习, 它接受一列c和一行r,从0开始计数并返回 三角形中那个点的数字。例如,pascal(0,2)=1, 帕斯卡(1,2)=2和帕斯卡(1,3)=3

这是我的第一个代码:

package recfun

object Main {
  def main(args: Array[String]) {
    println("Pascal's Triangle")
    for (row <- 0 to 10) {
      for (col <- 0 to row)
        print(pascal(col, row) + " ")
      println()
    }
  }

  var i = 0

  /**
    * Exercise 1
    */
  def pascal(c: Int, r: Int): Int = {
    if(c==r||c==0)
      1
    else
      i = pascal(c - 1, r - 1) + pascal(c, r - 1)
    i
  }

  /**
   * Exercise 2
   */
    def balance(chars: List[Char]): Boolean = ???

  /**
   * Exercise 3
   */
    def countChange(money: Int, coins: List[Int]): Int = ???
  }
然后我尝试更改代码,得到正确的结果

package recfun

object Main {
  def main(args: Array[String]) {
    println("Pascal's Triangle")
    for (row <- 0 to 10) {
      for (col <- 0 to row)
        print(pascal(col, row) + " ")
      println()
    }
  }


  /**
    * Exercise 1
    */
  def pascal(c: Int, r: Int): Int = {
    if(c==r||c==0)
      1
    else
       pascal(c - 1, r - 1) + pascal(c, r - 1)
  }

  /**
   * Exercise 2
   */
    def balance(chars: List[Char]): Boolean = ???

  /**
   * Exercise 3
   */
    def countChange(money: Int, coins: List[Int]): Int = ???
  }
package-recfun
对象主体{
def main(参数:数组[字符串]){
println(“帕斯卡三角”)

对于(行在第二个代码中,if语句的值是函数的结果。在第一个函数中,
i
是函数的结果,if语句的值没有被使用。因此,所有重要的是if语句对
i
做了什么。if语句的then部分对
i
没有任何作用,所以我如果取then部分,结果将是
i
的上一个值,它将是0。

在第二个代码中,if语句的值是函数的结果。在第一个函数中,
i
是函数的结果,if语句的值没有被使用。因此,重要的是if语句做了什么if语句的then部分对
i
没有任何作用,因此如果取then部分,结果将是
i
的上一个值,即0

There is problem in your first pascal function
i=0
def pascal(c: Int, r: Int): Int = {
    if(c==r||c==0)
      1
    else
      i = pascal(c - 1, r - 1) + pascal(c, r - 1)
    i
  }

In if-else block always var 'i' is returned which has value as 0. In else condition it is assigned but as recurring pascal will return initial 'i' value (0), it will be always 0.

It is not bad practise to use global variable in function only for returning any value so second approach is more correct still if you want to return value with global variable at least assign value in if and else block as below

i=0
def pascal(c: Int, r: Int): Int = {
    if(c==r||c==0)
      i=1    // this will be assigned for the first time and when r==c
    else
      i = pascal(c - 1, r - 1) + pascal(c, r - 1) // this will be assigned for subsequent calculations
    i  // it will return value which is calculated in if else block
  }

**It is recommended to use proper curly braces {} to avoid such confusion.** 

def pascal(c: Int, r: Int): Int = {
    if(c==r||c==0){      
        i=1
    } else{    
       i = pascal(c - 1, r - 1) + pascal(c, r - 1)
   } 
    i
  }

In the second code, you just have if-else block and no statement after this block and scala is smart and return from if and else block only.
希望它能回答你的问题


希望它能回答你的问题。

为什么if语句的then部分对i没有任何作用?@genius pig为什么会这样?它根本没有提到
i
@sepp2k
例如,我认为pascal(1,1)将返回1,因为if语句的then部分已经执行。@genius pig
pascal(1,1)
将返回
i
的值,因为这是函数体中的最后一个表达式。
i
的值将为0,因为这是它的起始值(除非在调用函数之前将其设置为其他值)你永远不会改变它。谢谢,我明白了。我误解了在if语句的then部分已经执行之后,函数就结束了。就像c编程语言一样。为什么if语句的then部分对我没有任何作用?@genius pig为什么会这样?它根本没有提到
I
@sepp2k
,我认为pascal(1,1)将返回1,因为if语句的then部分已经执行。@genius pig
pascal(1,1)
将返回
I
的值,因为这是函数体中的最后一个表达式。
I
的值将为0,因为它的开头是这样的(除非在调用函数之前将其设置为其他值)你永远不会改变它。谢谢,我明白了。我误解了在if语句的then部分已经执行之后,函数结束了。就像c编程语言一样。谢谢,我误解了在if语句的then部分已经执行之后,函数结束并返回结果。就像c编程语言一样uage.没问题,如果你对每个块条件都使用大括号就好了,如果它对你有帮助,你可以投票。好的,np.如果你有任何其他疑问,请告诉我。你可以接受答案谢谢,我误解了在if语句的then部分已经执行之后,函数结束并返回结果。就像c编程语言一样。没有p问题,如果你们在每个方块条件下都使用大括号就好了,若它对你们有帮助,你们可以投票。好的,np。若你们有任何其他疑问,请告诉我。你们可以接受答案
package recfun

object Main {
  def main(args: Array[String]) {
    println("Pascal's Triangle")
    for (row <- 0 to 10) {
      for (col <- 0 to row)
        print(pascal(col, row) + " ")
      println()
    }
  }


  /**
    * Exercise 1
    */
  def pascal(c: Int, r: Int): Int = {
    if(c==r||c==0)
      1
    else
       pascal(c - 1, r - 1) + pascal(c, r - 1)
  }

  /**
   * Exercise 2
   */
    def balance(chars: List[Char]): Boolean = ???

  /**
   * Exercise 3
   */
    def countChange(money: Int, coins: List[Int]): Int = ???
  }
There is problem in your first pascal function
i=0
def pascal(c: Int, r: Int): Int = {
    if(c==r||c==0)
      1
    else
      i = pascal(c - 1, r - 1) + pascal(c, r - 1)
    i
  }

In if-else block always var 'i' is returned which has value as 0. In else condition it is assigned but as recurring pascal will return initial 'i' value (0), it will be always 0.

It is not bad practise to use global variable in function only for returning any value so second approach is more correct still if you want to return value with global variable at least assign value in if and else block as below

i=0
def pascal(c: Int, r: Int): Int = {
    if(c==r||c==0)
      i=1    // this will be assigned for the first time and when r==c
    else
      i = pascal(c - 1, r - 1) + pascal(c, r - 1) // this will be assigned for subsequent calculations
    i  // it will return value which is calculated in if else block
  }

**It is recommended to use proper curly braces {} to avoid such confusion.** 

def pascal(c: Int, r: Int): Int = {
    if(c==r||c==0){      
        i=1
    } else{    
       i = pascal(c - 1, r - 1) + pascal(c, r - 1)
   } 
    i
  }

In the second code, you just have if-else block and no statement after this block and scala is smart and return from if and else block only.